import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public class Main { public static void main(String[] args) { CountMonitor mon = new CountMonitor(); Runnable task = new MyTask(mon); Thread worker = new Thread(task); Thread worker2 = new Thread(task); worker.start(); worker2.start(); } } class MyTask implements Runnable { private final int MAX_COUNT = 10000; private CountMonitor mon; public MyTask(CountMonitor mon) { this.mon = mon; } public void run() { System.out.println("Starting! Shared counter: " + mon.getCounter()); for (int i = 0; i < MAX_COUNT; i++) { mon.increment(); } System.out.println("Done! Shared counter: " + mon.getCounter()); } } class CountMonitor { private final Lock lock = new ReentrantLock(); private int sharedCounter = 0; public void increment() { lock.lock(); try { sharedCounter = sharedCounter + 1; } finally { lock.unlock(); } } public int getCounter() {return sharedCounter;} }