首页 > 解决方案 > 阻塞其他线程直到一个线程完成的最佳方法

问题描述

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

我有以下情况:

    ReentrantLock lock = new ReentrantLock

    void doSomething() {

      if (lock.tryLock()) {

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

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

标签: javaconcurrencyjava.util.concurrent

解决方案


根据有关ReentrantLock类的文档:

推荐的做法是总是在调用 lock 之后立即使用 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()方法的文档中:“如果锁被另一个线程持有,那么当前线程将被禁用以用于线程调度目的并处于休眠状态,直到获得锁”,这就是您希望在您的场景中得到保证的内容.


推荐阅读