public class ReadPriority { int activeReaders, waitingReaders, activeWriters; public ReadPriority (int N) { activeReaders = 0; // |s.rdrs| waitingReaders = 0; // |{e in q: e[2] = "enter_read"}| activeWriters = 0; // |s.wrtrs| } public synchronized void StartRead () { waitingReaders++; while (activeWriters > 0) try { wait(); } catch (java.lang.InterruptedException e) { }; waitingReaders--; activeReaders++; } public synchronized boolean EndRead () { if (activeReaders == 0) return false; activeReaders--; if (activeReaders == 0) notifyAll(); return true; } public synchronized void StartWrite () { while (activeReaders > 0 || activeWriters > 0 || waitingReaders > 0) try { wait(); } catch (java.lang.InterruptedException e) { }; activeWriters++; } public synchronized boolean EndWrite () { if (activeWriters == 0) return false; activeWriters--; notifyAll(); return true; } }