【问题标题】:Why does Java allows to initialize semaphore with negative permit?为什么Java允许用负许可初始化信号量?
【发布时间】:2021-04-16 10:21:07
【问题描述】:

在 Semaphore (java.util.concurrent.Semaphore) 的初始化期间,我对负面许可的背后没有理性。

我知道调用 release() 方法最终可能会使 Semaphore 的许可大于等于一 (>=1),以便稍后其他线程可以获得许可。或者稍后在程序执行期间,当更多线程在执行 acquire() 方法时等待许可时,Semaphore 可能有负许可。

但是,我没有得到任何实际的用例来初始化带有负许可的信号量。

示例代码供参考:

import java.util.concurrent.Semaphore;

public class SemaphoreDemo {

    public static void main(String[] args) throws InterruptedException {
        // TODO Auto-generated method stub
        Semaphore s = new Semaphore(-2);
        System.out.println(s.availablePermits());
        s.release(3); // adding 3 permits
        System.out.println(s.availablePermits()); // now it has 1 permit        
    }
}

【问题讨论】:

  • 我从未见过任何数字以外的任何实际用例(这只是一个穷人的Lock)。真的。我见过的所有例子都是人为的和/或有更好的选择。在这方面,用负百初始化信号量并不比用正百创建信号量差。

标签: java semaphore java.util.concurrent


【解决方案1】:

如果您在创建信号量时知道某些资源已经在使用中,这可能会很有用。例如初始化中使用的那些资源。

【讨论】:

    【解决方案2】:

    为什么 java 不允许在信号量构造函数中使用负数?信号量只是一种限制对某些资源的访问的机制。如果我们想从一开始就限制访问,我们不妨将信号量初始化为负值,并确保暂时没有线程会接触该资源。

    javadoc 很清楚:

    @param 允许初始可用许可数。

    这个值可能是负数,在这种情况下释放 必须在授予任何收购之前发生。

    您可能处于这样一种情况,从一开始,您就需要等待某些资源打开并可用,然后才能开始使用它。


    例如:假设您有 3 个线程正在构建您需要使用的文件。此操作需要时间。完成所有 3 个线程后,您才能继续工作。您必须等待这三个线程释放信号量才能继续工作。现在,这可能不是一个好的解决方案,但至少可以处理负许可的初始信号量。


    here发布了另一个具有相同口头禅的例子

    【讨论】:

      猜你喜欢
      • 2013-07-05
      • 1970-01-01
      • 1970-01-01
      • 2017-12-07
      • 1970-01-01
      • 2011-11-25
      • 2015-09-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多