什么是Java中的阻塞信号量?

时间:2018-02-22 10:05:06

标签: java semaphore

根据我的理解,阻塞信号量被初始化为零而不是一个,工作方式是任何执行P(S)操作的线程都将阻塞,直到首先由V(S)释放。

任何人都可以用一个例子来解释这个机制,任何帮助都会受到赞赏

2 个答案:

答案 0 :(得分:2)

引用Semaphare类的javadoc

  

许可证 - 可用的初始许可证数量。此值可能为负值,在这种情况下,必须在授予任何获取之前发布。

  

每个acquire()都会在必要时阻止,直到获得许可证为止,然后接受它。每个版本()都会添加一个许可证,可能会释放一个阻塞收单器。

因此,假设您使用 -1 初始化,信号量将阻止acquire()来电,直到release()进来。

从这个意义上说:你只需要semaphore = new Sempahore(-1),你就会发现semaphore.acquire()会阻塞,直到某个其他线程进行semaphore.release()调用。

这就是全部。

答案 1 :(得分:1)

  

阻止信号量

java.util.concurrent.Semaphore类支持阻塞和非阻塞操作。

  

阻塞信号量初始化为零而不是一个

您可以设置许可的初始数量。如果您将permits设置为1new Semaphore(1)),则可以acquire之前release {。}}。

  • 如果值为> 0,则某些acquire可能会在release之前发生。
  • 如果值为<= 0,则必须在调用release之前发生一些acquire

记录在JavaDoc

  

此值可能为负值,在这种情况下,必须在授予任何获取之前发布。

class Example {

    public static void main(String[] args) throws InterruptedException {
        final Semaphore s1 = new Semaphore(0);
        s1.acquire(); 
        // the thread is disabled
        // no permit is available
        // a blocking operation

        final Semaphore s2 = new Semaphore(1);
        s2.acquire();
        // returns immediately
        // one permit was available

        final Semaphore s3 = new Semaphore(0);
        if (s3.tryAcquire()) {
            // a non-blocking operation
            // returns false immediately
        }
    }

}