接下来是一个简单的信号量实现。
public class Semaphore {
private boolean signal = false;
public synchronized void take() {
this.signal = true;
this.notify();
}
public synchronized void release() throws InterruptedException {
while (!this.signal) wait();
this.signal = false;
}
}
是真的,通过调用take()信号量模仿信号获取并唤醒随机选择的线程(如果它实际存在)并通过调用release(),如果未获取信号,信号量强制当前(触发)线程等待notify()但是将信号采集设置为false?
这是否意味着,如果我有3个线程的单个信号量,我将不得不为代码部分中的每个线程运行take() - release()对,这不是线程安全的吗?
答案 0 :(得分:0)
是的,正如所写的那样,take()
将从release()
中阻止的线程中唤醒随机选择的主题,如果release()
,则take()
会等待signal
来电在进入时是假的。这表示您的名称take()
和release()
向后:take()
应该是阻止来电。
这是一个二进制信号量,因为它只有两个状态。如果您像使用互斥锁一样使用它,则需要take()
- release()
对包装需要隔离的代码。但是,在这种情况下,使用普通的互斥锁会更好。
信号量有很多用途(参见“信号量小书”),但通常比互斥量和监视器/条件变量更难正确使用。