H2O 生成
下面这道题真的难到我了,看了解析后是用信号量机制去做了,看了半天看明白(平时没写过信号量😅)
下面的信号量机制保证了O和H在资源获取不到时,去获取资源,在资源释放不掉时,就去释放资源
- h.acquire(); // 获取一个H资源
- o.release(); // 释放一个O资源
- o.acquire(2); // 获取两个O资源(这里容易理解错,并不是获取两个O,这里是保证一次只能有一个进程执行O,看输出)
- h.release(2); // 释放两个H资源
上面的所以四个,如果不满足,则会阻塞!(理解了这句话,就看明白下面的代码了)
class H2O {private Semaphore h = new Semaphore(2);private Semaphore o = new Semaphore(2);public H2O() {}public void hydrogen(Runnable releaseHydrogen) throws InterruptedException {h.acquire();// releaseHydrogen.run() outputs "H". Do not change or remove this line.releaseHydrogen.run();o.release();}public void oxygen(Runnable releaseOxygen) throws InterruptedException {o.acquire(2);releaseOxygen.run();h.release(2);}
}