如何解释信号量处理操作?

时间:2010-09-29 21:44:08

标签: java multithreading semaphore

接下来是一个简单的信号量实现。

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()对,这不是线程安全的吗?

1 个答案:

答案 0 :(得分:0)

是的,正如所写的那样,take()将从release()中阻止的线程中唤醒随机选择的主题,如果release(),则take()会等待signal来电在进入时是假的。这表示您的名称take()release()向后:take()应该是阻止来电。

这是一个二进制信号量,因为它只有两个状态。如果您像使用互斥锁一样使用它,则需要take() - release()对包装需要隔离的代码。但是,在这种情况下,使用普通的互斥锁会更好。

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