【问题标题】:How to explain semaphore processing operation?如何解释信号量处理操作?
【发布时间】:2010-09-29 21:44:07
【问题描述】:

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

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

【问题讨论】:

    标签: java multithreading semaphore


    【解决方案1】:

    是的,如所写,take() 将从release() 中阻塞的线程中唤醒一个随机选择的线程,如果signal 在进入时为假,release() 将等待take() 调用。这表明您将名称 take()release() 倒过来:take() 应该是阻塞调用。

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

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

    【讨论】:

    • 使用互斥锁。感谢您的建议!
    猜你喜欢
    • 1970-01-01
    • 2020-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-04
    • 2015-10-28
    • 1970-01-01
    • 2018-10-26
    相关资源
    最近更新 更多