gpt4 book ai didi

java并发: lightweight nonblocking semaphore?

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:56:53 24 4
gpt4 key购买 nike

我有一个回调想执行一次。为了争论起见,我们假设它看起来像这样:

final X once = new X(1);
Runnable r = new Runnable() {
@Override public void run() {
if (once.use())
doSomething();
}
}

其中 X 是一些具有以下行为的并发对象:

  • 构造函数:X(int N) -- 分配 N 个使用许可

  • boolean use():如果至少有1个use permit,消费其中一个返回true。否则返回假。此操作对于多线程而言是原子的。

我知道我可以使用 java.util.concurrent.Semaphore为此,但我不需要它的阻塞/等待方面,我希望这是一次性使用的东西。

AtomicInteger 看起来不够,除非我做类似的事情

class NTimeUse {
final private AtomicInteger count;
public NTimeUse(int N) { this.count = new AtomicInteger(N); }
public boolean use() {
while (true)
{
int n = this.count.get();
if (n == 0)
return false;
if (this.count.compareAndSet(n, n-1))
return true;
}
}

我对 while 循环感到不安。

CountDownLatch 不会工作,因为 countDown() method没有返回值,不能通过 getCount() 自动执行。

我应该只使用 Semaphore 还是有更合适的类?

最佳答案

在单许可的情况下你可以使用AtomicBoolean:

final AtomicBoolean once = new AtomicBoolean(true);
Runnable r = new Runnable() {
@Override public void run() {
if (once.getAndSet(false))
doSomething();
}
}

如果您需要很多许可,请使用带有compareAndSet() 的解决方案。不用担心循环,getAndIncrement() 在幕后以相同的方式工作。

关于java并发: lightweight nonblocking semaphore?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5395168/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com