簡體   English   中英

Java中的同步輔助

[英]Synchronization aid in java

我正在運行Web服務器。 每個用戶請求都將更新/查找數據庫。 並發數據庫連接的最大數目應小於N。第N + 1個並發請求應退出並執行其他邏輯,而不是連接到數據庫。 我能想到的是使用原子整數,該整數將在連接到db時按每個請求遞增/遞減。

我的問題是,除了Atomic Integer之外,Java中是否還有其他同步輔助工具可用? 我不認為我可以為此使用CountDownLatch或循環障礙。

Semaphore是這種情況下最合適的同步原語:

private Semaphore s = new Semaphore(N);

public void doRequest() {
    if (s.tryAquire()) {
        try {
            ...
        } finally {
            s.release();
        }
    } else {
        // other logic
    }
}

您可以嘗試連接的ArrayBlockingQueue 用N初始化隊列。

  1. 用N初始化隊列
  2. 填充N個連接。
  3. 每當有人需要連接時,請先執行q.poll()
  4. 如果q.poll()返回null,則執行“執行其他邏輯”
  5. 使用后,將連接放回池中。

但是我會敦促為此使用現有的解決方案,例如proxool

或者,您可以使用諸如Apache Commons DBCP之類的連接池,它將為您處理連接,並且可以在沒有連接池時等待連接,或者拋出並可以處理異常。

添加到suraj的答案中,我認為您的問題更多是producer consumer ,我更喜歡LinkedBlockingQueue以提高吞吐量。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM