gpt4 book ai didi

java - 是否可以在 AtomicBoolean 包含所需值之前阻塞线程?

转载 作者:行者123 更新时间:2023-12-05 05:36:48 26 4
gpt4 key购买 nike

我有一个系统,有很多写入器和一个读取器,每个读取器都在一个单独的线程中运行。当工作可用时,作者会通知读者,而读者会阻塞,直到收到通知。

鉴于作者的数量,我想使用无锁实现来通知读者。每次读者醒来时,它都会重置通知标志,做一些工作,并阻塞等待更多通知到达。本质上,我正在寻找一个 AtomicBoolean 的等价物,它能够阻塞直到它的值变为真。

到目前为止我尝试了什么:

  • 我当前的实现使用信号量
  • 信号量在没有许可的情况下开始。
  • 读者阻止尝试获得许可。
  • 作者调用 Semaphore.release() 以通知读者。
  • 读取器调用 Semaphore.drainPermits(),做一些工作,然后在 Semaphore.acquire 上再次阻塞。

我不喜欢Semaphore 方法的地方:

  • 看起来有点笨手笨脚。我只关心第一个通知到达。我不需要统计收到了多少其他通知。
  • 如果计数超过 Integer.MAX_VALUE,信号量将抛出异常。这与其说是实际问题,不如说是理论问题,但仍不理想。

是否有一种数据结构等同于 AtomicBoolean 并具有阻止等待特定值的能力?

或者,是否有一种线程安全的方式来确保Semaphore 的许可数量永远不会超过某个值?

最佳答案

BlockingQueue<Singleton> 会充分做到这一点。

例如,您将创建一个 ArrayBlockingQueue<Singleton>(1) ,然后你的服务员看起来像:

queue.take();

... 通知程序看起来像:

queue.offer(Singleton.INSTANCE)

…使用offer确保将多个版本组合在一起。

关于java - 是否可以在 AtomicBoolean 包含所需值之前阻塞线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73253268/

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