题目简介
解答
方法一
synchronized
class H2O {
private int hydrogen;
private int oxygen;
public void hydrogen(Runnable releaseHydrogen) throws InterruptedException {
synchronized (this){
while (hydrogen == 2){
wait();
}
hydrogen++;
releaseHydrogen.run();
if (hydrogen == 2 && oxygen == 1){
hydrogen = 0;
oxygen = 0;
notifyAll();
}
}
}
public void oxygen(Runnable releaseOxygen) throws InterruptedException {
synchronized (this){
while (oxygen == 1){
wait();
}
oxygen++;
releaseOxygen.run();
if (hydrogen == 2 && oxygen == 1){
hydrogen = 0;
oxygen = 0;
notifyAll();
}
}
}
}
解答成功:
执行耗时:13 ms,击败了99.23% 的Java用户
内存消耗:39.9 MB,击败了67.51% 的Java用户
方法二
Lock + Condition
class H2O {
private volatile int hydrogen;
private volatile int oxygen;
private final Lock lock = new ReentrantLock(false);
private Condition condition = lock.newCondition();
public void hydrogen(Runnable releaseHydrogen) throws InterruptedException {
lock.lock();
try {
while (hydrogen == 2){
condition.await();
}
releaseHydrogen.run();
hydrogen++;
if (hydrogen == 2 && oxygen == 1){
hydrogen = 0;
oxygen = 0;
condition.signalAll();
}
} finally {
lock.unlock();
}
}
public void oxygen(Runnable releaseOxygen) throws InterruptedException {
lock.lock();
try {
while (oxygen == 1){
condition.await();
}
releaseOxygen.run();
oxygen++;
if (hydrogen == 2 && oxygen == 1){
hydrogen = 0;
oxygen = 0;
condition.signalAll();
}
} finally {
lock.unlock();
}
}
}
解答成功:
执行耗时:14 ms,击败了90.85% 的Java用户
内存消耗:40.1 MB,击败了37.59% 的Java用户
方法三
信号量
Semaphore
class H2O {
private Semaphore h = new Semaphore(2);
private Semaphore o = new Semaphore(0);
public void hydrogen(Runnable releaseHydrogen) throws InterruptedException {
h.acquire();
releaseHydrogen.run();
if(h.availablePermits() == 0) {
o.release();
}
}
public void oxygen(Runnable releaseOxygen) throws InterruptedException {
o.acquire();
releaseOxygen.run();
if (h.availablePermits() == 0){
h.release(2);
}
}
}
解答成功:
执行耗时:14 ms,击败了90.85% 的Java用户
内存消耗:40 MB,击败了56.89% 的Java用户
方法四
Semaphore + CyclicBarrier
class H2O {
private Semaphore h = new Semaphore(2);
private Semaphore o = new Semaphore(1);
private CyclicBarrier cyclicBarrier = new CyclicBarrier(3,()->{
h.release(2);
o.release();
});
public H2O() {
}
public void hydrogen(Runnable releaseHydrogen) throws InterruptedException {
h.acquire();
releaseHydrogen.run();
try {
cyclicBarrier.await();
} catch (Exception e) {}
}
public void oxygen(Runnable releaseOxygen) throws InterruptedException {
o.acquire();
releaseOxygen.run();
try {
cyclicBarrier.await();
} catch (Exception e) {}
}
}
解答成功:
执行耗时:14 ms,击败了90.53% 的Java用户
内存消耗:42 MB,击败了8.92% 的Java用户