View Javadoc

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