import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; import java.util.concurrent.locks.Condition; class SodaMachine { private int sodaCount = 0; private final int capacity; private final Lock lock = new ReentrantLock(); private final Condition hasSodaToBuy = lock.newCondition(); private final Condition needsRefill = lock.newCondition(); public SodaMachine(int capacity) { this.capacity = capacity; } public void buySoda() { lock.lock(); try { while (sodaCount == 0) { hasSodaToBuy.await(); } sodaCount--; System.out.println("Buying a soda, remaning count is " + sodaCount); if (sodaCount == 0) { needsRefill.signal(); } } catch (InterruptedException ie) { System.out.println("Got interrupted while trying to buy soda"); } finally { lock.unlock(); } } public void refill() { lock.lock(); try { while (sodaCount > 0) { needsRefill.await(); } sodaCount = capacity; System.out.println("Refilling, soda count is " + sodaCount); hasSodaToBuy.signalAll(); } catch (InterruptedException ie) { System.out.println("Got interrupted while trying to refill soda"); } finally { lock.unlock(); } } }