Java可重入锁的正确锁定/解锁用法

Java可重入锁的正确锁定/解锁用法,java,synchronization,Java,Synchronization,我有一个叫做“H2O问题”的家庭作业,我要实现一个叫做H2OBarrier的类,它有3个方法 HReady,氢原子(线程)就绪时调用的方法 OReady,当氧原子(线程)准备就绪时调用的方法 makeWater,当两个氢原子和一个氧原子准备就绪时称为makeWater的方法 我应该使用Java可重入锁和条件来实现这一点 这是到目前为止我的代码,我想知道我是否正确使用了锁定和解锁 public class H2OBarrier { int hCount; int oCount; Lock

我有一个叫做“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();

}

} 
公共类安全栅{
国际结算;
国际账户;
Lock Lock=新的可重入锁();
条件hWait=lock.newCondition();
条件oWait=lock.newCondition();
public-void-HReady(){
lock.lock();
hCount++;
试一试{
等待;
}捕捉(中断异常e){
e、 printStackTrace();
}
}
公共空间{
lock.lock();
oCount++;
试一试{

而(hCount您的代码正在产生死锁。假设5个o原子先通过,5个进入由wait()生成的o队列。现在,如果2个h原子通过,则所有h原子都将自动等待,因为您的代码。

我确实通过了,但我不确定是否有unlock()在我的OReady和HReady方法中调用是有意义的。或者你主要是指我没有使用try/catch/finally语句?我用try blocks更新了它。我可以看到。谢谢你的捕获。