如何在Java中等待另一个线程释放锁?

6

我正在尝试找出如何在另一个线程释放锁之前正确等待的方法。

我认为代码会更好地解释我的意思:

myLock.lock();
sendSomewhereMyLock(myLock); //creates new threads inside
myLock.waitUntilReleasedByAnotherThread(60L, TimeUnit.SECONDS);
//do something after the lock is released

我认为我需要使用tryLock(long time, TimeUnit unit)方法,但Java文档表示该方法将立即执行,因为锁已由当前线程获取:
如果锁可用,则此方法立即返回true。如果锁不可用,则当前线程变为禁用状态以进行线程调度,并休眠,直到以下三种情况之一发生:
- 当前线程获得该锁;或 - 其他某个线程中断当前线程,并支持中断锁获取;或 - 经过指定的等待时间
那么我应该使用什么?

1
这是一个 XY 问题吗?(http://mywiki.wooledge.org/XyProblem) 你实际上想要达到什么目的? - Jason
2个回答

7

我建议使用CountDownLatch,它专门为此目的设计:

一个同步辅助对象,允许一个或多个线程等待其他线程中执行的一组操作完成。

示例用法:

CountDownLatch latch = new CountDownLatch(1);
new Thread(() -> {
    doSomething();
    latch.countDown(); // Reaches 0, latch is released
}).start();
latch.await(60L, TimeUnit.SECONDS);

7
我认为你需要的是一个条件,通过它,你可以定义一个类似于workCompleted的条件,并让初始线程检查并等待该条件。
final Condition workCompleted = myLock.newCondition();
//...
myLock.lock();
try {
  final OtherThread otherThread = startOtherThread(myLock, workCompleted);
  while (otherThread.completed() == false) {
    workCompleted.await();
  }
} finally {
  myLock.unlock();
}

// other thread
doTheWork();
this.completed = true;
theLock.lock();
try {
  workCompleted.signal();
} finally {
  theLock.unlock();
}

并发包中预先制定了几种这样的条件,其中一些可能比上面的简单示例更符合您的要求。


看起来就是我需要的。谢谢! - Oleksandr
谢谢提到并发包! - Skynet

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接