java - 简单计数信号量

标签 java concurrency semaphore

为了理解计数信号量的工作原理,我决定实现一个简单的版本。 我想验证我当前的实现实际上是一个正确的实现并且我没有遗漏任何明显的东西

public class CountingSemaphore {
    private int limit;

    public CountingSemaphore(int limit) {
        this.limit = limit;
    }

    public synchronized void acquire() {
        try {
            if (limit == 0)
                wait();

            limit--;
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public synchronized void release() {
        try {
            if(limit == 0) 
                notifyAll();

            limit++;
        }catch(Exception e) {
            e.printStackTrace();
        }
    }

}

最佳答案

除一个细节外,这应该有效。
由于您使用了 notifyAll(),(正如@JBNizet 指出的那样,由于虚假唤醒的风险,)您可以唤醒多个等待线程,所有这些都将被释放并减少 限制
改变

if (limit == 0)
    wait();

while (limit == 0) {
    wait();
}

你应该没问题。

关于java - 简单计数信号量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12571648/

相关文章:

c# - 使用 WaitOne(100) 与 WaitOne(0) + Task.Delay(100) 等待命名信号量

java - 如何使用 java 从 CPLEX 导出双模型?

mysql - 如何最好地处理多对多并发冲突?

java - Scala - 如何使用 Futures 在发生异常时发送失败响应

c - 段错误使用信号量来同步 C 中的 3 个线程

PHP exec() : Why can I access shared memory, 但没有命名信号量? (错误号 = 13)

java - 如何在 REST Assured 中访问底层的 Jackson ObjectMapper?

java - 构造特定的正则表达式

java - 在 JFrame 中添加字符串的最佳方法

WCF 并发连接和 Azure 服务总线中继