gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:30:32 25 4
gpt4 key购买 nike

我有一个名为“H2O 问题”的家庭作业,我应该在其中实现一个名为 H2OBarrier 的类,该类具有 3 个方法。

  • HReady,氢原子(线程)就绪时调用的方法
  • OReady,当氧原子(线程)就绪时调用的方法
  • makeWater,当 2 个氢原子和一个氧原子准备就绪时调用的一种方法

我应该使用 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() 吗?该程序的整个流程对我来说似乎非常合乎逻辑,我只是​​想确保我正在做的事情总体上看起来是正确的。

最佳答案

您的代码产生了死锁。假设 5 个原子首先通过,5 个进入 await() 生成的队列。现在 2 个 h 原子是否通过都没有关系,因为您的代码,所有 h 原子都会自动等待。

关于java - Java 可重入锁的正确锁定/解锁用法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14736064/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com