【发布时间】:2016-04-07 13:08:33
【问题描述】:
我有以下代码:
public class Synchronizer {
private final Lock lock = new ReentrantLock();
private final Condition done = lock.newCondition();
private boolean isDone = false;
private void signalAll() {
lock.lock(); // MUST lock!
try {
isDone = true; // To help the await method ascertain that it has not waken up 'spuriously'
done.signalAll();
}
finally {
lock.unlock(); // Make sure to unlock even in case of an exception
}
}
public void await() {
lock.lock(); // MUST lock!
try {
while (!isDone) { // Ascertain that this is not a 'spurious wake-up'
done.await();
}
}
finally {
isDone = false; // for next time
lock.unlock(); // Make sure to unlock even in case of an exception
}
}
}
假设线程1调用synchornizer.await()并通过
lock.lock();
和上的块
done.await();
然后另一个线程 2 调用 synchronizer.signalAll() 以向线程 1 发出信号。我的问题是线程 2 如何能够通过调用来获取锁
lock.lock();
打电话之前
done.signallAll();
线程 1 最初获取锁的时间是什么时候?
我在这里发现了同样的问题:
Waiting on a condition in a reentrant lock
答案是:
Lock 和 synchronized 都暂时允许其他人获得锁 当他们在等待时。要停止等待,线程必须重新获取 锁。
我试图理解这是否意味着如果线程 1 没有调用 done.await(),线程 2 将无法获取锁?
答案还指出:
注意:他们不会完全释放它,如果你进行堆栈跟踪,你 可以有多个线程似乎同时持有锁, 但最多有一个会运行(其余的会等待)
但 Condition.await() 的文档指出:
与此条件关联的锁被原子释放
那么锁是否被释放,“他们没有完全释放”是什么意思?
【问题讨论】:
标签: java multithreading locking