import java.io.*; class RWLock2 { private int lockVal; private int sleepTime; public RWLock2( int pVal) { lockVal = pVal; sleepTime = 0; } public RWLock2 () { lockVal = 0; sleepTime = 0; } public RWLock2(RWLock2 pt) { lockVal = pt.getLockVal(); sleepTime = 0; } public int getLockVal () { return lockVal; } public void setSleepTime (int st) { sleepTime = st; } public String toString() { String str = "lockVal: " + lockVal; return str; } public synchronized boolean setReadLock(int val) { try { System.out.println("setReadLock with val: " + val + " before sleep"); if (sleepTime >0) Thread.sleep(sleepTime); System.out.println("setReadLock with val: " + val + " after sleep"); } catch (InterruptedException ie) { ie.printStackTrace(); } if (lockVal < 0) return false; else { lockVal++; return true; } } public synchronized boolean setReadLock() { try { if (sleepTime >0) Thread.sleep(sleepTime); } catch (InterruptedException ie) { ie.printStackTrace(); } if (lockVal < 0) return false; else { lockVal++; return true; } } public synchronized boolean clearReadLock(int val) { try { System.out.println("clearReadLock with val: " + val + " before sleep"); if (sleepTime >0) Thread.sleep(sleepTime); System.out.println("clearReadLock with val: " + val + " after sleep"); if (sleepTime >0) Thread.sleep(sleepTime); } catch (InterruptedException ie) { ie.printStackTrace(); } if (lockVal <= 0) return false; else { lockVal--; return true; } } public synchronized boolean clearReadLock() { try { if (sleepTime >0) Thread.sleep(sleepTime); } catch (InterruptedException ie) { ie.printStackTrace(); } if (lockVal <= 0) return false; else { lockVal--; return true; } } public synchronized boolean setWriteLock(int val) { try { System.out.println("setWriteLock with val: " + val + " before sleep"); if (sleepTime >0) Thread.sleep(sleepTime); System.out.println("setWriteLock with val: " + val + " after sleep"); } catch (InterruptedException ie) { ie.printStackTrace(); } if (lockVal != 0) return false; else { lockVal = -1; return true; } } public synchronized boolean setWriteLock() { try { if (sleepTime >0) Thread.sleep(sleepTime); } catch (InterruptedException ie) { ie.printStackTrace(); } if (lockVal != 0) return false; else { lockVal = -1; return true; } } public synchronized boolean clearWriteLock(int val) { try { System.out.println("clearWriteLock with val: " + val + " before sleep"); if (sleepTime >0) Thread.sleep(sleepTime); System.out.println("clearWriteLock with val: " + val + " after sleep"); } catch (InterruptedException ie) { ie.printStackTrace(); } if (lockVal != -1) return false; else { lockVal = 0; return true; } } public synchronized boolean clearWriteLock() { try { if (sleepTime >0) Thread.sleep(sleepTime); } catch (InterruptedException ie) { ie.printStackTrace(); } if (lockVal != -1) return false; else { lockVal = 0; return true; } } public static void main (String[] args) { RWLock2 rwl1 = new RWLock2 (); System.out.println ("rwl1 = " + rwl1); System.out.print ("Setting read lock on rwl1: "); if (rwl1.setReadLock()) System.out.println ("success rwl1 = " + rwl1); else System.out.println ("fail rwl1 = " + rwl1); System.out.print ("Setting write lock on rwl1: "); if (rwl1.setWriteLock()) System.out.println ("success rwl1 = " + rwl1); else System.out.println ("fail rwl1 = " + rwl1); System.out.print ("Setting read lock on rwl1: "); if (rwl1.setReadLock()) System.out.println ("success rwl1 = " + rwl1); else System.out.println ("fail rwl1 = " + rwl1); System.out.print ("Clearing read lock on rwl1: "); if (rwl1.clearReadLock()) System.out.println ("success rwl1 = " + rwl1); else System.out.println ("fail rwl1 = " + rwl1); System.out.print ("Clearing write lock on rwl1: "); if (rwl1.clearWriteLock()) System.out.println ("success rwl1 = " + rwl1); else System.out.println ("fail rwl1 = " + rwl1); System.out.print ("Clearing read lock on rwl1: "); if (rwl1.clearReadLock()) System.out.println ("success rwl1 = " + rwl1); else System.out.println ("fail rwl1 = " + rwl1); System.out.println (); RWLock2 rwl2 = new RWLock2 (); System.out.println ("rwl2 = " + rwl2); System.out.print ("Setting write lock on rwl2: "); if (rwl2.setWriteLock()) System.out.println ("success rwl2 = " + rwl2); else System.out.println ("fail rwl2 = " + rwl2); System.out.print ("Setting read lock on rwl2: "); if (rwl2.setReadLock()) System.out.println ("success rwl2 = " + rwl2); else System.out.println ("fail rwl2 = " + rwl2); System.out.print ("Setting write lock on rwl2: "); if (rwl2.setWriteLock()) System.out.println ("success rwl2 = " + rwl2); else System.out.println ("fail rwl2 = " + rwl2); System.out.print ("Clearing write lock on rwl2: "); if (rwl2.clearWriteLock()) System.out.println ("success rwl2 = " + rwl2); else System.out.println ("fail rwl2 = " + rwl2); System.out.print ("Clearing read lock on rwl2: "); if (rwl2.clearReadLock()) System.out.println ("success rwl2 = " + rwl2); else System.out.println ("fail rwl2 = " + rwl2); } }