import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; import java.util.concurrent.locks.Condition; class MyTask1 implements Runnable { Beholder tallBeholder; public MyTask1(Beholder tb) { tallBeholder = tb; } public void run() { for (int i = 0; i < 5000; i++) { tallBeholder.tellOpp(); } System.out.println(tallBeholder.getTall()); } } class MyTask2 implements Runnable { Beholder tallBeholder; public MyTask2(Beholder tb) { tallBeholder = tb; } public void run() { for (int i = 0; i < 5000; i++) { tallBeholder.tellNed(); } System.out.println(tallBeholder.getTall()); } } class Beholder { private int tall = 0; private Lock laas = new ReentrantLock(); private Condition trengerEnTilAaTelleOpp = laas.newCondition(); public void tellOpp() { laas.lock(); tall++; trengerEnTilAaTelleOpp.signal(); laas.unlock(); } public void tellNed() { laas.lock(); try { while (tall == 0) trengerEnTilAaTelleOpp.await(); tall--; } catch (InterruptedException exception) { System.out.println("Halla"); } finally { laas.unlock(); } } public int getTall() { return tall; } }