import java.util.concurrent.*; import java.util.*; public class WriterFirst { 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 rmutex = new Semaphore(1); private static Semaphore wmutex = new Semaphore(1); private static Semaphore readable = new Semaphore(1); private static int data = 0; private static int wcount = 0; private static int rcount = 0; private static class Reader implements Runnable { public void run() { try { while ( true ) { readable.acquire(); rmutex.acquire(); rcount++; rmutex.release(); readable.release(); System.out.println("read " + data); rmutex.acquire(); rcount--; rmutex.release(); Thread.sleep((int)(Math.random() * 1000)); } } catch( InterruptedException ex ) { ex.printStackTrace(); } } } private static class Writer implements Runnable { public void run() { try { while ( true ) { mutex.acquire(); wmutex.acquire(); wcount++; if ( wcount == 1 ) readable.acquire(); wmutex.release(); data = (int)(Math.random() * 1231); System.out.println("\t\t\twrite " + data); wmutex.acquire(); wcount--; if ( wcount == 0 ) readable.release(); wmutex.release(); mutex.release(); Thread.sleep((int)(Math.random() * 1000)); } } catch( InterruptedException ex ) { ex.printStackTrace(); } } } }