关于许可证数量的问题

来源:10-5 Semaphore用法和注意点

慕标6114981

2020-03-09

悟空老师您好:
学习Semaphore的时候我写了下面的代码

public static void main(String[] args) throws InterruptedException {
        Semaphore semaphore = new Semaphore(5);
        semaphore.release(4);
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    semaphore.acquire(9);
                    System.out.println(Thread.currentThread().getName() + "获取到了9个许可证");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }).start();
}

最后的结果是线程能够获取到9个许可证,我查阅了一下相关资料,这种情况是正常的,并且我们可以把acquire理解为消费了一些许可证,release理解为创建了一些许可证,请问这种说法正确吗?另外,如果是这样的话,那么可能会出现许可证越来越多的情况,这种情况应该如何避免?或者说为什么要允许信号量超过初始值呢?是为了程序更加灵活吗?下图是程序的截图。
谢谢
图片

写回答

1回答

悟空

2020-03-09

这个问题我讲过了哈,就在这个小节里,程序并不限制释放许可证,如果符合业务逻辑,那就OK。

允许超过初始值,是为了更灵活,我们避免许可证越来越多的有效手段,就是释放和消费许可证的数量保持一致。但是JDK不会强制要求我们这么做,要靠我们自己了。

1
1
慕标6114981
谢谢
2020-03-10
共1条回复

深度解密Java并发工具,精通JUC,成为并发多面手

JUC全方位讲解,构建并发工具类知识体系

1599 学习 · 573 问题

查看课程