限制Java中静态方法的最大并发调用次数为N

4

Consider the following static method:

public void static foo() {
  // some heavy operation operating on a shared resource.
}

假设当并发调用foo()的数量超过十(10)时,系统变得不稳定。

如果在这种情况下我启动100个线程,所有线程都向foo()发送请求,则应用程序将变得不稳定,因为我们超出了系统可以处理的并发请求数量。

提高稳定性的一种方法是更改代码:

public void static synchronized foo() {
  // some heavy operation operating on a shared resource.
}

系统现在将能够处理100个线程同时请求 foo(),因为一次只允许一个调用 foo()
如果我想限制对foo()的访问,只允许最多 N 个并发请求,有什么简单的方法可以在Java中实现此限制?

可能也想看看这个:https://dev59.com/-XVC5IYBdhLWcg3wykUt - Daniel Ryan
对于那些遇到类似问题但是使用异步调用的人,请参考 https://dev59.com/ByT-s4cB2Jgan1znew1g#69234939 - morgwai
2个回答

13

使用一个初始值为10的Semaphore。在方法开始时获取一个许可,在方法结束时(在finally块中)释放它。


-1

CountDownLatch

可能可以解决你的问题。

它有阻塞和非阻塞两种方式。

编辑:修复URL


2
不,锁存器用于完全不同的任务(如等待 N 个任务完成)。这个答案令人误解并大部分是错误的。你正在寻找信号量。 - bestsss

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接