クラス org.objectweb.cjdbc.common.util.ReadPrioritaryFIFOWriteLock

すべてのメンバ一覧

説明

Reader/Writer lock with write priority.

If a reader holds the lock, all incoming readers are allowed to acquire the lock until a write arrives. A writer must wait for all current readers to release the lock before acquiring it.
When a writer has the lock, everybody else is blocked.
When a writer release the lock, there is a writer priority so if another writer is waiting it will have the lock even if it arrived later than readers. Writers are prioritary against readers but all writers get the lock in a FIFO order.

作者:
Emmanuel Cecchet
バージョン:
1.0

ReadPrioritaryFIFOWriteLock.java44 行で定義されています。

Public メソッド

 ReadPrioritaryFIFOWriteLock ()
void acquireRead () throws InterruptedException
synchronized void releaseRead ()
void acquireWrite () throws InterruptedException
synchronized void releaseWrite ()
final synchronized boolean isReadLocked ()
final synchronized boolean isWriteLocked ()

Private 変数

int activeReaders
boolean activeWriter
int waitingReaders
int waitingWriters
Object readSync
ArrayList writeWaitingQueue


コンストラクタとデストラクタ

org.objectweb.cjdbc.common.util.ReadPrioritaryFIFOWriteLock.ReadPrioritaryFIFOWriteLock  ) 
 

Creates a new ReadPrioritaryFIFOWriteLock instance. ReadPrioritaryFIFOWriteLock.java64 行で定義されています。

参照先 org.objectweb.cjdbc.common.util.ReadPrioritaryFIFOWriteLock.activeReaders, org.objectweb.cjdbc.common.util.ReadPrioritaryFIFOWriteLock.activeWriter, org.objectweb.cjdbc.common.util.ReadPrioritaryFIFOWriteLock.readSync, org.objectweb.cjdbc.common.util.ReadPrioritaryFIFOWriteLock.waitingReaders, org.objectweb.cjdbc.common.util.ReadPrioritaryFIFOWriteLock.waitingWriters, と org.objectweb.cjdbc.common.util.ReadPrioritaryFIFOWriteLock.writeWaitingQueue.

00065 { 00066 activeReaders = 0; 00067 activeWriter = false; 00068 waitingReaders = 0; 00069 waitingWriters = 0; 00070 readSync = new Object(); 00071 writeWaitingQueue = new ArrayList(); 00072 }


メソッド

void org.objectweb.cjdbc.common.util.ReadPrioritaryFIFOWriteLock.acquireRead  )  throws InterruptedException
 

Acquires the lock for a read.

例外:
InterruptedException if wait failed (the lock should remain in a correct state)
ReadPrioritaryFIFOWriteLock.java80 行で定義されています。

参照先 org.objectweb.cjdbc.common.util.ReadPrioritaryFIFOWriteLock.activeReaders, org.objectweb.cjdbc.common.util.ReadPrioritaryFIFOWriteLock.activeWriter, org.objectweb.cjdbc.common.util.ReadPrioritaryFIFOWriteLock.readSync, org.objectweb.cjdbc.common.util.ReadPrioritaryFIFOWriteLock.waitingReaders, と org.objectweb.cjdbc.common.util.ReadPrioritaryFIFOWriteLock.waitingWriters.

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 }

void org.objectweb.cjdbc.common.util.ReadPrioritaryFIFOWriteLock.acquireWrite  )  throws InterruptedException
 

Acquires the lock for a write.

例外:
InterruptedException if wait failed (the lock should remain in a correct state)
ReadPrioritaryFIFOWriteLock.java149 行で定義されています。

参照先 org.objectweb.cjdbc.common.util.ReadPrioritaryFIFOWriteLock.activeReaders, org.objectweb.cjdbc.common.util.ReadPrioritaryFIFOWriteLock.activeWriter, org.objectweb.cjdbc.common.util.ReadPrioritaryFIFOWriteLock.releaseWrite(), org.objectweb.cjdbc.common.util.ReadPrioritaryFIFOWriteLock.waitingWriters, と org.objectweb.cjdbc.common.util.ReadPrioritaryFIFOWriteLock.writeWaitingQueue.

参照元 org.objectweb.cjdbc.controller.loadbalancer.raidb2.RAIDb2ec.disableBackend(), org.objectweb.cjdbc.controller.loadbalancer.raidb1.RAIDb1ec.disableBackend(), org.objectweb.cjdbc.controller.loadbalancer.raidb2.RAIDb2ec.enableBackend(), と org.objectweb.cjdbc.controller.loadbalancer.raidb1.RAIDb1ec.enableBackend().

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 }

final synchronized boolean org.objectweb.cjdbc.common.util.ReadPrioritaryFIFOWriteLock.isReadLocked  ) 
 

Tests if the lock is currently held by at least one reader.

戻り値:
true if the lock is held by a reader
ReadPrioritaryFIFOWriteLock.java211 行で定義されています。

参照先 org.objectweb.cjdbc.common.util.ReadPrioritaryFIFOWriteLock.activeReaders.

00212 { 00213 return activeReaders > 0; 00214 }

final synchronized boolean org.objectweb.cjdbc.common.util.ReadPrioritaryFIFOWriteLock.isWriteLocked  ) 
 

Tests if the lock is currently held by a writer.

戻り値:
true if the lock is held by a writer
ReadPrioritaryFIFOWriteLock.java221 行で定義されています。

参照先 org.objectweb.cjdbc.common.util.ReadPrioritaryFIFOWriteLock.activeWriter.

00222 { 00223 return activeWriter; 00224 }

synchronized void org.objectweb.cjdbc.common.util.ReadPrioritaryFIFOWriteLock.releaseRead  ) 
 

Releases a lock previously acquired for reading. ReadPrioritaryFIFOWriteLock.java128 行で定義されています。

参照先 org.objectweb.cjdbc.common.util.ReadPrioritaryFIFOWriteLock.activeReaders, org.objectweb.cjdbc.common.util.ReadPrioritaryFIFOWriteLock.activeWriter, org.objectweb.cjdbc.common.util.ReadPrioritaryFIFOWriteLock.waitingWriters, と org.objectweb.cjdbc.common.util.ReadPrioritaryFIFOWriteLock.writeWaitingQueue.

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 }

synchronized void org.objectweb.cjdbc.common.util.ReadPrioritaryFIFOWriteLock.releaseWrite  ) 
 

Releases a lock previously acquired for writing. ReadPrioritaryFIFOWriteLock.java181 行で定義されています。

参照先 org.objectweb.cjdbc.common.util.ReadPrioritaryFIFOWriteLock.activeWriter, org.objectweb.cjdbc.common.util.ReadPrioritaryFIFOWriteLock.readSync, org.objectweb.cjdbc.common.util.ReadPrioritaryFIFOWriteLock.waitingReaders, org.objectweb.cjdbc.common.util.ReadPrioritaryFIFOWriteLock.waitingWriters, と org.objectweb.cjdbc.common.util.ReadPrioritaryFIFOWriteLock.writeWaitingQueue.

参照元 org.objectweb.cjdbc.common.util.ReadPrioritaryFIFOWriteLock.acquireWrite(), org.objectweb.cjdbc.controller.loadbalancer.raidb2.RAIDb2ec.disableBackend(), org.objectweb.cjdbc.controller.loadbalancer.raidb1.RAIDb1ec.disableBackend(), org.objectweb.cjdbc.controller.loadbalancer.raidb2.RAIDb2ec.enableBackend(), と org.objectweb.cjdbc.controller.loadbalancer.raidb1.RAIDb1ec.enableBackend().

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 }


変数

int org.objectweb.cjdbc.common.util.ReadPrioritaryFIFOWriteLock.activeReaders [private]
 

Threads executing read. ReadPrioritaryFIFOWriteLock.java47 行で定義されています。

参照元 org.objectweb.cjdbc.common.util.ReadPrioritaryFIFOWriteLock.acquireRead(), org.objectweb.cjdbc.common.util.ReadPrioritaryFIFOWriteLock.acquireWrite(), org.objectweb.cjdbc.common.util.ReadPrioritaryFIFOWriteLock.isReadLocked(), org.objectweb.cjdbc.common.util.ReadPrioritaryFIFOWriteLock.ReadPrioritaryFIFOWriteLock(), と org.objectweb.cjdbc.common.util.ReadPrioritaryFIFOWriteLock.releaseRead().

boolean org.objectweb.cjdbc.common.util.ReadPrioritaryFIFOWriteLock.activeWriter [private]
 

Is there an active writer? ReadPrioritaryFIFOWriteLock.java50 行で定義されています。

参照元 org.objectweb.cjdbc.common.util.ReadPrioritaryFIFOWriteLock.acquireRead(), org.objectweb.cjdbc.common.util.ReadPrioritaryFIFOWriteLock.acquireWrite(), org.objectweb.cjdbc.common.util.ReadPrioritaryFIFOWriteLock.isWriteLocked(), org.objectweb.cjdbc.common.util.ReadPrioritaryFIFOWriteLock.ReadPrioritaryFIFOWriteLock(), org.objectweb.cjdbc.common.util.ReadPrioritaryFIFOWriteLock.releaseRead(), と org.objectweb.cjdbc.common.util.ReadPrioritaryFIFOWriteLock.releaseWrite().

Object org.objectweb.cjdbc.common.util.ReadPrioritaryFIFOWriteLock.readSync [private]
 

ReadPrioritaryFIFOWriteLock.java58 行で定義されています。

参照元 org.objectweb.cjdbc.common.util.ReadPrioritaryFIFOWriteLock.acquireRead(), org.objectweb.cjdbc.common.util.ReadPrioritaryFIFOWriteLock.ReadPrioritaryFIFOWriteLock(), と org.objectweb.cjdbc.common.util.ReadPrioritaryFIFOWriteLock.releaseWrite().

int org.objectweb.cjdbc.common.util.ReadPrioritaryFIFOWriteLock.waitingReaders [private]
 

Threads not yet in read. ReadPrioritaryFIFOWriteLock.java53 行で定義されています。

参照元 org.objectweb.cjdbc.common.util.ReadPrioritaryFIFOWriteLock.acquireRead(), org.objectweb.cjdbc.common.util.ReadPrioritaryFIFOWriteLock.ReadPrioritaryFIFOWriteLock(), と org.objectweb.cjdbc.common.util.ReadPrioritaryFIFOWriteLock.releaseWrite().

int org.objectweb.cjdbc.common.util.ReadPrioritaryFIFOWriteLock.waitingWriters [private]
 

Threads not yet in write. ReadPrioritaryFIFOWriteLock.java56 行で定義されています。

参照元 org.objectweb.cjdbc.common.util.ReadPrioritaryFIFOWriteLock.acquireRead(), org.objectweb.cjdbc.common.util.ReadPrioritaryFIFOWriteLock.acquireWrite(), org.objectweb.cjdbc.common.util.ReadPrioritaryFIFOWriteLock.ReadPrioritaryFIFOWriteLock(), org.objectweb.cjdbc.common.util.ReadPrioritaryFIFOWriteLock.releaseRead(), と org.objectweb.cjdbc.common.util.ReadPrioritaryFIFOWriteLock.releaseWrite().

ArrayList org.objectweb.cjdbc.common.util.ReadPrioritaryFIFOWriteLock.writeWaitingQueue [private]
 

ReadPrioritaryFIFOWriteLock.java59 行で定義されています。

参照元 org.objectweb.cjdbc.common.util.ReadPrioritaryFIFOWriteLock.acquireWrite(), org.objectweb.cjdbc.common.util.ReadPrioritaryFIFOWriteLock.ReadPrioritaryFIFOWriteLock(), org.objectweb.cjdbc.common.util.ReadPrioritaryFIFOWriteLock.releaseRead(), と org.objectweb.cjdbc.common.util.ReadPrioritaryFIFOWriteLock.releaseWrite().


このクラスの説明は次のファイルから生成されました:
CJDBCversion1.0.4に対してTue Oct 12 15:16:19 2004に生成されました。 doxygen 1.3.8