https://leetcode-cn.com/problems/building-h2o/ 了
eetcode上面 出现了 Concurrent 的 类型问题。这是其中一道问题。我做了一下。 我用的是synchronized/wait/nofity的方式去做的。
这里有一个人是用 https://leetcode.com/problems/building-h2o/discuss/332997/Java-solution-using-Monitors new ReentrantLock(); 的方式去进行求解的。
我的代码如下
class H2O {
private static final Object HydrogenLock = new Object();
private static final Object OxygenLock = new Object();
private int hydrogenNum;
private int oxygenNum;
public H2O() {
this.hydrogenNum = 0;
this.oxygenNum = 0;
}
public synchronized void hydrogen(Runnable releaseHydrogen) throws InterruptedException {
synchronized(HydrogenLock){
while(this.hydrogenNum > 2* this.oxygenNum){
OxygenLock.wait();
}
// releaseHydrogen.run() outputs "H". Do not change or remove this line.
releaseHydrogen.run();
this.hydrogenNum +=1;
HydrogenLock.notifyAll();
}
}
public synchronized void oxygen(Runnable releaseOxygen) throws InterruptedException {
synchronized(OxygenLock){
// when oxygen threads arrives, any other new oxygen threads will be blocked.
while(this.hydrogenNum < 2* this.oxygenNum){
HydrogenLock.wait();
}
// releaseOxygen.run() outputs "O". Do not change or remove this line.
releaseOxygen.run();
this.oxygenNum +=1;
OxygenLock.notifyAll();
}
}
}
我发现这样写代码有潜在的错误就是 notify 的时候会并没有阻塞的线程,从而抛出 Thrown exception java.lang.IllegalMonitorStateException 的异常。讲道理两种方法应该是可以互通的。 我感觉我还是不是很懂 Condition中的await 方法。查了些资料总感觉云里雾里的。 https://leetcode.com/problems/building-h2o/discuss/332997/Java-solution-using-Monitors 里的代码
hydrogen 的方法中
while (countH > 2*countO){
waitO.await();
}
为什么是调用 waitO condition的 await。。这道题卡了我半天。 想知道老师是如何思考这类题的。感觉非常受挫。。总是感觉会绕进去