我有一个具有多个写入器和一个读取器的系统,每个读取器都在单独的线程中运行.当有工作可用时,写入者通知读取器,读取器阻止,直到得到通知.
在给定写入器数量的情况下,我希望使用无锁实现来通知读取器.每次读取器醒来时,它都会重置通知标志,执行一些工作,并阻止等待更多通知到达.
从本质上讲,我寻找的是AtomicBoolean
的类似功能,它具有阻止的能力,直到它的值成为真.
到目前为止,我try 过的是:
- 我目前的实现使用的是
Semaphore
. - 信号灯在开始时没有许可证.
- 阅读器阻止了试图获得许可证的行为.
- 写入器调用
Semaphore.release()
以通知读取器. - 读取器调用
Semaphore.drainPermits()
,做一些工作,然后再次阻塞Semaphore.acquire
.
我不喜欢Semaphore
%方法的原因是:
- 这似乎有点严厉.我只关心第一个到达的通知.我不需要统计收到了多少其他通知.
- 如果信号量的计数超过
Integer.MAX_VALUE
,则会抛出异常.这更多的是一个理论问题,而不是实践问题,但仍然不理想.
是否有一个等于AtomicBoolean
的数据 struct 能够阻止等待特定值?
或者,有没有一种线程安全的方式来确保Semaphore
的许可数量永远不会超过某个值?