[英]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
设置为1
( new 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.