import java.util.concurrent.*; import java.util.*; public class ReaderFirst { public static void main(String[] args) { ExecutorService executor = Executors.newCachedThreadPool(); executor.execute(new Reader()); executor.execute(new Writer()); executor.shutdown(); } private static Semaphore mutex = new Semaphore(1); private static Semaphore db = new Semaphore(1); private static int data; private static int readcount = 0; private static class Reader implements Runnable { public void run() { try { while ( true ) { mutex.acquire(); readcount++; if ( readcount == 1 ) db.acquire(); mutex.release(); System.out.println("read " + data); mutex.acquire(); readcount--; if ( readcount == 0 ) db.release(); mutex.release(); Thread.sleep((int)(Math.random() * 1000)); } } catch( InterruptedException ex ) { ex.printStackTrace(); } } } private static class Writer implements Runnable { public void run() { try { while ( true ) { db.acquire(); data = (int)(Math.random() * 2312); System.out.println("\t\t\tWrite " + data); db.release(); Thread.sleep((int)(Math.random() * 1000)); } } catch( InterruptedException ex ) { ex.printStackTrace(); } } } }