请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

两道题目带来的疑问

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。。这道题卡了我半天。 想知道老师是如何思考这类题的。感觉非常受挫。。总是感觉会绕进去

正在回答

2回答

同学好,请问这个问题解决了吗,没解决的话请按照我回复的提供哈

0 回复 有任何疑惑可以回复我~
  • 提问者 慕斯6088333 #1
    非常感谢!
    回复 有任何疑惑可以回复我~ 2019-07-16 10:26:25
  • 提问者 慕斯6088333 #2
    这个网上都是汇聚的面试题,不能debug的。全都是黑箱的,目的就是考在interview时的思维能力和对一些知识的掌握能力。不过我去看了他们的代码,尝试着理解了。
    回复 有任何疑惑可以回复我~ 2019-07-16 10:30:55
  • 翔仔 回复 提问者 慕斯6088333 #3
    同学加油,程序都是人想出来的,所以理解起来应该也不难,除非写得特别差:)
    回复 有任何疑惑可以回复我~ 2019-07-16 13:21:34
翔仔 2019-07-13 12:51:20

同学好,需要同学把完整的代码都贴上来,这类课程以外的问题比较花时间,因此信息也要充分些,包括测试的代码也都得贴上来,翔仔会尽力去看,最近小孩出生之后每天不能睡整觉精神也不佳,思维也不灵敏:)。一般这种问题可以回溯法,通过运行设置断点或者看看调用栈,然后回溯看看如何去定位问题,不要灰心,多线程并发就在于难以控制执行顺序,需要耐心,多做做题就会有感觉。

0 回复 有任何疑惑可以回复我~
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信