同步Java可重入锁的正确锁定/解锁用法
我有一个叫做“H2O问题”的家庭作业,我要实现一个叫做H2OBarrier的类,它有3个方法
- HReady,氢原子(线程)就绪时调用的方法
- OReady,当氧原子(线程)准备就绪时调用的方法
- makeWater,当两个氢原子和一个氧原子准备就绪时称为makeWater的方法
我应该使用Java可重入锁和条件来实现这一点
这是到目前为止我的代码,我想知道我是否正确使用了锁定和解锁
public class H2OBarrier {
int hCount;
int oCount;
Lock lock = new ReentrantLock();
Condition hWait = lock.newCondition();
Condition oWait = lock.newCondition();
public void HReady() {
lock.lock();
hCount++;
try {
hWait.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public void OReady(){
lock.lock();
oCount++;
try {
while(hCount<2 && oCount<1){
oWait.await();
}
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
makeWater();
}
}
public void makeWater(){
hCount--;
hWait.signal();
lock.unlock();
hCount--;
hWait.signal();
lock.unlock();
oCount--;
oWait.signal();
lock.unlock();
}
}
我应该在makeWater方法之外的任何地方调用unlock()吗?程序的整个流程对我来说似乎很有逻辑意义,我只是想确保我所做的总体上看起来是正确的
# 1 楼答案
您的代码正在产生死锁。假设5个o原子先通过,5个进入由wait()产生的o队列。现在,如果2个氢原子通过,所有的氢原子都会自动等待,因为你的代码