繁体   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