1 package gov.bnl.gums; 2 3 import org.apache.log4j.Logger; 4 5 public class RWLock 6 { 7 private int givenLocks; 8 private int waitingWriters; 9 private Logger log = Logger.getLogger(RWLock.class); 10 11 private Object mutex; 12 13 public RWLock() 14 { 15 mutex = new Object(); 16 givenLocks = 0; 17 waitingWriters = 0; 18 } 19 20 public void getReadLock() 21 { 22 synchronized(mutex) 23 { 24 while((givenLocks == -1) || (waitingWriters != 0)) 25 try { 26 mutex.wait(); 27 } catch (InterruptedException e) { 28 log.error(e); 29 } 30 31 givenLocks++; 32 } 33 } 34 35 public void getWriteLock() 36 { 37 synchronized(mutex) 38 { 39 waitingWriters++; 40 while(givenLocks != 0) { 41 try { 42 mutex.wait(); 43 } catch (InterruptedException e) { 44 log.error(e); 45 } 46 } 47 48 waitingWriters--; 49 givenLocks = -1; 50 } 51 } 52 53 54 public void releaseLock() 55 { 56 synchronized(mutex) 57 { 58 if(givenLocks == 0) 59 return; 60 61 if(givenLocks == -1) 62 givenLocks = 0; 63 else 64 givenLocks--; 65 66 mutex.notifyAll(); 67 } 68 } 69 70 71 } 72 73 74