【问题标题】:Best way to block other threads until one is finished阻塞其他线程直到一个线程完成的最佳方法
【发布时间】:2019-09-06 09:05:49
【问题描述】:

我有很多线程来监控某个状态。如果应用程序进入该状态,那么我需要做一些额外的工作。我想只允许 1 个线程执行它,并希望阻止其他线程,直到该工作完成。阻塞意味着他们不能再次执行该任务。

我有以下场景:

    ReentrantLock lock = new ReentrantLock

    void doSomething() {

      if (lock.tryLock()) {

       try {
         doSomeWork()
       } finally {
         lock.unLock()
       }
      } else {
        // wait for DoSomeWork is done
      }
    }

我可以在循环中监视lock.isLocked(),但实际上我只是想等到另一个线程完成工作。

【问题讨论】:

  • 您的问题到底是什么?您可以使用lock.lock(),它将等待锁被释放并保证在给定时间只有一个线程拥有它,这不是您想要的吗?
  • 啊,是的,不知何故,我只是把它复杂化了。拥有try {lock.lock() } finally {lock.unlock()} 将解决问题

标签: java concurrency java.util.concurrent


【解决方案1】:

根据有关ReentrantLock类的文档:

建议的做法是始终立即跟进来电 用 try 块锁定,最常见的是在构造之前/之后 如:

class X {
   private final ReentrantLock lock = new ReentrantLock();
   // ...

   public void m() {
     lock.lock();  // block until condition holds
     try {
       // ... method body
     } finally {
       lock.unlock()
     }
   }
 }

来自lock() 方法的文档:“如果锁被另一个线程持有,那么当前线程将被禁用以用于线程调度目的并处于休眠状态,直到获得锁”是您希望在您的场景中得到保证的内容。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-25
    • 1970-01-01
    • 2017-02-28
    • 2012-05-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多