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();
}
}
}