This value may be negative, in which case releases must occur before any acquires will be granted.
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
}
}
}
permits - the initial number of permits available. This value may be negative, in which case releases must occur before any acquires will be granted.
以及:
Each acquire() blocks if necessary until a permit is available, and then takes it. Each release() adds a permit, potentially releasing a blocking acquirer.
因此,假设您使用-1初始化,信号量将阻止acquire()调用,直到release()进入
从这个意义上说:您只需执行semaphore = new Sempahore(-1),就会发现semaphore.acquire()将阻塞,直到其他线程执行了semaphore.release()调用
# 1 楼答案
^{} 类同时支持阻塞和非阻塞操作
您可以设置许可证的初始数量。如果将
permits
设置为1
(new Semaphore(1)
),则可以在release
之前acquire
一次> 0
,则某些acquire
可能发生在release
之前<= 0
,则在调用acquire
之前必须出现一些release
李>它记录在JavaDoc中:
# 2 楼答案
引用Semaphare类的javadoc:
以及:
因此,假设您使用-1初始化,信号量将阻止
acquire()
调用,直到release()
进入从这个意义上说:您只需执行
semaphore = new Sempahore(-1)
,就会发现semaphore.acquire()
将阻塞,直到其他线程执行了semaphore.release()
调用这就是一切