2010-09-29 25 views
0

接下来是一个简单的信号量实现。如何解释信号量处理操作?

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; 
    } 
} 

这是真的,是通过调用取()旗语模仿信号采集和唤醒随机选择的线程(如果它确实存在),并通过调用release(),如果没有收购,旗语力电流信号(触发)线程等待notify()但将信号采集设置为false?

这是否意味着,如果我有3个线程的单个信号量,那么我将不得不为每个线程在线程安全的代码部分运行take() - release()对?

回答

0

是的,写的,take()会唤醒那些挡在release()随机选择的线程,release()将等待take()呼叫如果signal是入境假的。这表明您的名称为take()release()倒退:take()应该是阻止呼叫。

这是一个二进制信号量,因为它只有两个状态。如果你像互斥体一样使用它,那么你将需要一个包装需要被隔离的代码的对。然而,在这种情况下,你最好用简单的互斥体。

信号量有很多用途(请参阅“小信号灯”),但通常比互斥和监视器/条件变量更难正确使用。

+0

用过的互斥。谢谢你的建议! – 2010-09-29 23:33:40