[英]Java - Reentrant Lock, can't access newly created Condition
我已经创建了一个新的Condition chopstickFree
并且在我的pickUpChopstick()
方法中,我正在等待锁定它,但我根本无法访问它。
经过调试我发现,当它到达chopstickFree.await()
在该行pickUpChopstick()
方法,它只是无限期暂停
我不明白? 构造函数中的代码只是一个不确定的尝试让它工作,但不管怎样,我创建了一个新的条件,向所有人说明它是免费的,但我根本无法锁定它?
public class Chopstick {
Lock lock = new ReentrantLock();
private Condition chopstickFree = lock.newCondition();
private Condition chopstickInUse = lock.newCondition();
Chopstick() {
lock.lock();
chopstickFree.signalAll();
lock.unlock();
}
// Pick up chopstick
public void pickUpChopstick() throws InterruptedException {
lock.lock();
try {
chopstickFree.await(); // ALWAYS PAUSES HERE INDEFINITELY
chopstickInUse.signalAll();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
// Release chopstick
public void releaseChopstick() {
lock.lock();
chopstickFree.signal();
lock.unlock();
}
}
有任何想法吗?
干杯
Condition#signalAll()
仅表示当前处于Condition#await()
(或其朋友)中的线程,即信号未排队等待以后的调用。
您需要另一个受锁保护的标志才能正确实现:
public class Chopstick {
private final Lock lock = new ReentrantLock();
private final Condition chopstickFree = lock.newCondition();
private volatile boolean isFree = true;
Chopstick() { /* Nothing */ }
// Pick up chopstick
public void pickUpChopstick() throws InterruptedException {
lock.lock();
try {
while (!isFree) {
chopstickFree.await();
}
isFree = false;
} finally {
lock.unlock();
}
}
// Release chopstick
public void releaseChopstick() {
lock.lock();
try {
isFree = true;
chopstickFree.signal();
} finally {
lock.unlock();
}
}
}
这是一个使用Semaphore
的版本,它可能与原始实现的距离更近一些:
public class Chopstick {
private final Semaphore chopsticksAvailable = new Semaphore(1);
Chopstick() {
// Nothing
}
// Pick up chopstick
public void pickUpChopstick() throws InterruptedException {
chopsticksAvailable.acquire();
}
// Release chopstick
public void releaseChopstick() {
chopsticksAvailable.release();
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.