src/org/objectweb/cjdbc/common/util/ReadPrioritaryFIFOWriteLock.java

説明を見る。
00001 00025 package org.objectweb.cjdbc.common.util; 00026 00027 import java.util.ArrayList; 00028 00044 public class ReadPrioritaryFIFOWriteLock 00045 { 00047 private int activeReaders; 00048 00050 private boolean activeWriter; 00051 00053 private int waitingReaders; 00054 00056 private int waitingWriters; 00057 00058 private Object readSync; 00059 private ArrayList writeWaitingQueue; 00060 00064 public ReadPrioritaryFIFOWriteLock() 00065 { 00066 activeReaders = 0; 00067 activeWriter = false; 00068 waitingReaders = 0; 00069 waitingWriters = 0; 00070 readSync = new Object(); 00071 writeWaitingQueue = new ArrayList(); 00072 } 00073 00080 public void acquireRead() throws InterruptedException 00081 { 00082 synchronized (this) 00083 { 00084 if ((waitingWriters == 0) && !activeWriter) 00085 { // No active or pending writer 00086 activeReaders++; 00087 return; 00088 } 00089 } 00090 00091 // Beyond this point, we have to wait 00092 synchronized (readSync) 00093 { 00094 // It becomes a little bit tricky here but a writer could have 00095 // released the lock between the first test at the beginning of 00096 // this function and this point. Therefore we have to recheck if 00097 // the lock is not completely idle else we'll never wake up ! 00098 synchronized (this) 00099 { 00100 if (!activeWriter) 00101 { // No active or pending writer 00102 activeReaders++; 00103 return; 00104 } 00105 } 00106 00107 waitingReaders++; 00108 try 00109 { 00110 readSync.wait(); 00111 } 00112 catch (InterruptedException ie) 00113 { 00114 waitingReaders--; // roll back state 00115 throw ie; 00116 } 00117 waitingReaders--; 00118 } 00119 synchronized (this) 00120 { 00121 activeReaders++; 00122 } 00123 } 00124 00128 public synchronized void releaseRead() 00129 { 00130 activeReaders--; 00131 if ((activeReaders == 0) && (waitingWriters > 0)) 00132 { // Wake up first waiting write if any 00133 Object ww = writeWaitingQueue.remove(0); 00134 synchronized (ww) 00135 { 00136 ww.notify(); 00137 activeWriter = true; 00138 waitingWriters--; 00139 } 00140 } 00141 } 00142 00149 public void acquireWrite() throws InterruptedException 00150 { 00151 synchronized (Thread.currentThread()) 00152 { 00153 synchronized (this) 00154 { 00155 if ((activeReaders == 0) && !activeWriter) 00156 { 00157 activeWriter = true; 00158 return; 00159 } 00160 else 00161 { 00162 waitingWriters++; 00163 writeWaitingQueue.add(Thread.currentThread()); 00164 } 00165 } 00166 try 00167 { 00168 Thread.currentThread().wait(); 00169 } 00170 catch (InterruptedException ie) 00171 { 00172 releaseWrite(); 00173 throw ie; 00174 } 00175 } 00176 } 00177 00181 public synchronized void releaseWrite() 00182 { 00183 activeWriter = false; 00184 00185 // Writer priority 00186 if (waitingWriters > 0) 00187 { // Wake up first waiting write if any 00188 Object ww = writeWaitingQueue.remove(0); 00189 synchronized (ww) 00190 { 00191 ww.notify(); 00192 activeWriter = true; 00193 waitingWriters--; 00194 } 00195 } 00196 00197 // Wake up readers 00198 else 00199 synchronized (readSync) 00200 { 00201 if (waitingReaders > 0) 00202 readSync.notifyAll(); 00203 } 00204 } 00205 00211 public final synchronized boolean isReadLocked() 00212 { 00213 return activeReaders > 0; 00214 } 00215 00221 public final synchronized boolean isWriteLocked() 00222 { 00223 return activeWriter; 00224 } 00225 }

CJDBCversion1.0.4に対してTue Oct 12 15:15:58 2004に生成されました。 doxygen 1.3.8