Java 在一个线程完成之前阻止其他线程的最佳方法

Java 在一个线程完成之前阻止其他线程的最佳方法,java,concurrency,java.util.concurrent,Java,Concurrency,Java.util.concurrent,我有许多线程监视特定的状态。如果应用程序进入那种状态,那么我需要做一些额外的工作。我希望只允许一个线程执行该任务,并希望阻止其他线程,直到该任务完成。阻塞意味着他们不能再次执行该任务 我有以下情况: ReentrantLock lock = new ReentrantLock void doSomething() { if (lock.tryLock()) { try { doSomeWork() } finally

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

我有以下情况:

    ReentrantLock lock = new ReentrantLock

    void doSomething() {

      if (lock.tryLock()) {

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

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

根据有关类的文档:

建议的做法是始终立即拨打电话 使用try块锁定,最典型的是在构建之前/之后锁定 例如:


从方法的文档中可以看到:“如果锁由另一个线程持有,那么当前线程出于线程调度目的将被禁用,并处于休眠状态,直到获得锁为止”,这是您希望在场景中得到保证的

你的问题到底是什么?您可以使用
lock.lock()
,它将等待锁被释放,并保证在给定的时间内只有一个线程拥有它,这不是您想要的吗?啊,是的,不知怎么的,我把它复杂化了。让
尝试{lock.lock()}最后{lock.unlock()}
将解决问题
class X {
   private final ReentrantLock lock = new ReentrantLock();
   // ...

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