根据我的理解,阻塞信号量被初始化为零而不是一个,工作方式是任何执行P(S)操作的线程都将阻塞,直到首先由V(S)释放。
任何人都可以用一个例子来解释这个机制,任何帮助都会受到赞赏
答案 0 :(得分:2)
引用Semaphare类的javadoc:
许可证 - 可用的初始许可证数量。此值可能为负值,在这种情况下,必须在授予任何获取之前发布。
和
每个acquire()都会在必要时阻止,直到获得许可证为止,然后接受它。每个版本()都会添加一个许可证,可能会释放一个阻塞收单器。
因此,假设您使用 -1 初始化,信号量将阻止acquire()
来电,直到release()
进来。
从这个意义上说:你只需要semaphore = new Sempahore(-1)
,你就会发现semaphore.acquire()
会阻塞,直到某个其他线程进行semaphore.release()
调用。
这就是全部。
答案 1 :(得分:1)
阻止信号量
java.util.concurrent.Semaphore
类支持阻塞和非阻塞操作。
阻塞信号量初始化为零而不是一个
您可以设置许可的初始数量。如果您将permits
设置为1
(new 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
}
}
}