二进制信号量的 java 结构

What java structure for a binary semaphore

我有:

要点:

我想我正在寻找一些实现二进制信号量的标准结构,其中允许的最大数量为 1,以便工作人员可以调用多个 release() 而不会相互阻塞,并且如果 release() 被调用,然后:

代码应如下所示:

[Workers]
.. produce item ..
sem.release()

[GUI Thread]
while(true) {
  sem.acquire()
  .. update gui ..
}

请注意,使用 1 个可用许可初始化的 Semaphore 不是这种情况的解决方案,因为许多工人同时完成他们的任务应该只释放一个许可;否则 GUI 线程会 运行 太多次

使用信号量?

生产者 'up' 每生产一个项目,信号量加 1。

Consumer 'downs' 信号量由尽可能多的;像这样:

sema.acquire();  
n = 1;
while (sema.tryAcquire(very short timeout))
    ++n;
// there are now known to be n items available
   

也许在 GUI 末尾的 tryAcquire 上有相同的循环 'routing',不管它是什么。

这有点活泼。您对 一次更新的要求有多严格?你能忍受偶尔得到不止一个吗?

如果必须恰好只有一次更新,则需要双向互锁(即经典的生产者-消费者)。如果没有它,无论您做什么,都无法在您决定已全部完成后的几纳秒内阻止生产者生产 'just one more item'。要关闭该漏洞,需要告知生产者在 GUI 更新时推迟。