【发布时间】:2018-02-22 10:05:06
【问题描述】:
根据我的理解,阻塞信号量被初始化为零而不是一,其工作方式是任何执行 P(S) 操作的线程都会阻塞,直到首先被 V(S) 释放。
谁能用一个例子解释这个机制,任何帮助将不胜感激
【问题讨论】:
根据我的理解,阻塞信号量被初始化为零而不是一,其工作方式是任何执行 P(S) 操作的线程都会阻塞,直到首先被 V(S) 释放。
谁能用一个例子解释这个机制,任何帮助将不胜感激
【问题讨论】:
一个阻塞信号量
java.util.concurrent.Semaphore 类同时支持阻塞和非阻塞操作。
阻塞信号量初始化为零而不是一
您设置了初始许可数。如果将permits 设置为1 (new Semaphore(1)),则可以在release 之前acquire 一次。
> 0,则一些acquires 可能发生在releases 之前。 <= 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
}
}
}
【讨论】:
引用 Semaphare 类的javadoc:
permits - 可用许可的初始数量。此值可能为负数,在这种情况下,必须在授予任何获取之前进行释放。
还有:
如果有必要,每个 acquire() 会阻塞,直到获得许可,然后再接受它。每个 release() 添加一个许可,可能会释放一个阻塞的获取者。
因此,假设您使用 -1 进行初始化,信号量将阻止 acquire() 调用,直到 release() 进来。
从这个意义上说:您只需执行semaphore = new Sempahore(-1),您会发现semaphore.acquire() 将阻塞,直到其他线程完成semaphore.release() 调用。
这就是全部。
【讨论】: