Building H2O

多线程的题, 给两个方法, 一边是h一边是o, 问如何即时返回水(h2o). 通过观察可以看到, 水是两个h一个o, 那么当一个o出现的时候, 我们就检查是否有两个h. 当h不够2的时候, 就等h够2再继续运行. 所以一个互斥锁即可.

class H2O {
    private AtomicInteger water;
    public H2O() {
        water = new AtomicInteger();
    }

    public void hydrogen(Runnable releaseHydrogen) throws InterruptedException {
	    synchronized(water){
            while(water.get() == 2)
                water.wait();
            water.addAndGet(1);
            releaseHydrogen.run();
            water.notifyAll();
        }
        // releaseHydrogen.run() outputs "H". Do not change or remove this line.
    }

    public void oxygen(Runnable releaseOxygen) throws InterruptedException {
        synchronized(water){
            while(water.get() < 0)
                water.wait();
            water.addAndGet(-2);
            releaseOxygen.run();
            water.notifyAll();
        }
    }
}