A Reader/Writer lock originally written for ICU service implementation. The internal implementation was replaced with the JDK's stock read write lock (ReentrantReadWriteLock) for ICU 52.
This assumes that there will be little writing contention. It also doesn't allow active readers to acquire and release a write lock, or deal with priority inversion issues.
Access to the lock should be enclosed in a try/finally block
in order to ensure that the lock is always released in case of
exceptions:
try {
lock.acquireRead();
// use service protected by the lock
}
finally {
lock.releaseRead();
}
The lock provides utility methods getStats and clearStats to return statistics on the use of the lock.
| Modifier and Type | Class and Description |
|---|---|
| public static class | ICURWLock.Stats
Internal class used to gather statistics on the RWLock. |
| Modifier and Type | Field and Description |
|---|---|
| private ReentrantReadWriteLock | |
| private ICURWLock. |
| Access | Constructor and Description |
|---|---|
| public |
| Modifier and Type | Method and Description |
|---|---|
| public void | |
| public void | |
| public synchronized ICURWLock. | |
| public synchronized ICURWLock. | |
| public void | |
| public void | |
| public synchronized ICURWLock. |
| rwl | back to summary |
|---|---|
| private ReentrantReadWriteLock rwl | |
| stats | back to summary |
|---|---|
| private ICURWLock. | |
| ICURWLock | back to summary |
|---|---|
| public ICURWLock() | |
| acquireRead | back to summary |
|---|---|
| public void acquireRead() Acquire a read lock, blocking until a read lock is available. Multiple readers can concurrently hold the read lock. If there's a writer, or a waiting writer, increment the waiting reader count and block on this. Otherwise increment the active reader count and return. Caller must call releaseRead when done (for example, in a finally block). | |
| acquireWrite | back to summary |
|---|---|
| public void acquireWrite() Acquire the write lock, blocking until the write lock is available. Only one writer can acquire the write lock, and when held, no readers can acquire the read lock. If there are no readers and no waiting writers, mark as having an active writer and return. Otherwise, add a lock to the end of the waiting writer list, and block on it. Caller must call releaseWrite when done (for example, in a finally block).
| |
| clearStats | back to summary |
|---|---|
| public synchronized ICURWLock. Clear the stats (stop collecting stats). Returns existing stats, if any. | |
| getStats | back to summary |
|---|---|
| public synchronized ICURWLock. Return a snapshot of the current stats. This does not reset the stats. | |
| releaseRead | back to summary |
|---|---|
| public void releaseRead() Release a read lock and return. An error will be thrown if a read lock is not currently held. If this is the last active reader, notify the oldest waiting writer. Call when finished with work controlled by acquireRead. | |
| releaseWrite | back to summary |
|---|---|
| public void releaseWrite() Release the write lock and return. An error will be thrown if the write lock is not currently held. If there are waiting readers, make them all active and notify all of them. Otherwise, notify the oldest waiting writer, if any. Call when finished with work controlled by acquireWrite. | |
| resetStats | back to summary |
|---|---|
| public synchronized ICURWLock. Reset the stats. Returns existing stats, if any. | |
| Modifier and Type | Field and Description |
|---|---|
| public int | _mrc
Number of times concurrent read access granted (multiple read count). |
| public int | _rc
Number of times read access granted (read count). |
| public int | _wc
Number of times write access granted (writer count). |
| public int | _wrc
Number of times blocked for read (waiting reader count). |
| public int | _wwc
Number of times blocked for write (waiting writer count). |
| Access | Constructor and Description |
|---|---|
| private | |
| private | |
| private |
| Modifier and Type | Method and Description |
|---|---|
| public String |
| _mrc | back to summary |
|---|---|
| public int _mrc Number of times concurrent read access granted (multiple read count). | |
| _rc | back to summary |
|---|---|
| public int _rc Number of times read access granted (read count). | |
| _wc | back to summary |
|---|---|
| public int _wc Number of times write access granted (writer count). | |
| _wrc | back to summary |
|---|---|
| public int _wrc Number of times blocked for read (waiting reader count). | |
| _wwc | back to summary |
|---|---|
| public int _wwc Number of times blocked for write (waiting writer count). | |
| Stats | back to summary |
|---|---|
| private Stats() | |
| Stats | back to summary |
|---|---|
| private Stats(int rc, int mrc, int wrc, int wc, int wwc) | |
| Stats | back to summary |
|---|---|
| private Stats(ICURWLock. | |
| toString | back to summary |
|---|---|
| public String toString() Overrides java. Return a string listing all the stats.
| |