繁体   English   中英

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

[英]What is a blocking semaphore in Java?

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

任何人都可以用一个例子来解释这种机制,任何帮助将不胜感激

引用Semaphare类的javadoc

许可证-可用的初始许可证数量。 该值可能为负,在这种情况下,必须先进行发布,然后再进行任何收购。

和:

如有必要,每个Acquisition()都会阻塞,直到获得许可为止,然后再获取许可。 每个release()添加一个许可,有可能释放阻塞获取者。

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

从这个意义上讲:您只需执行semaphore = new Sempahore(-1) ,您就会发现semaphore.acquire()将阻塞,直到其他线程完成了semaphore.release()调用为止。

这就是全部。

阻塞信号量

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

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

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

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

它记录在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
        }
    }

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM