|
JavaTM 2 Platform Standard Ed. 6 |
|||||||||
| 上一個類別 下一個類別 | 框架 無框架 | |||||||||
| 摘要: 巢狀 | 欄位 | 建構子 | 方法 | 詳細資訊: 欄位 | 建構子 | 方法 | |||||||||
java.lang.Objectjava.util.concurrent.locks.ReentrantReadWriteLock
public class ReentrantReadWriteLock
支持與 ReentrantLock 類似語義的 ReadWriteLock 實作。
此類別具有以下屬性:
此類別不會將讀取者優先或寫入者優先強加給鎖存取的排序。但是,它確實支持可選的公平 策略。
如果保持寫入鎖,或者有一個等待的 writer 執行緒,則試圖獲得公平讀取鎖(非重入地)的執行緒將會阻塞。直到當前最舊的等待 writer 執行緒已獲得並釋放了寫入鎖之後,該執行緒才會獲得讀取鎖。當然,如果等待 writer 放棄其等待,而保留一個或更多 reader 執行緒為佇列中帶有寫入鎖自由的時間最長的 waiter,則將為那些 reader 分派讀取鎖。
試圖獲得公平寫入鎖的(非重入地)的執行緒將會阻塞,除非讀取鎖和寫入鎖都自由(這意味著沒有等待執行緒)。(注意,非阻塞 ReentrantReadWriteLock.ReadLock.tryLock() 和 ReentrantReadWriteLock.WriteLock.tryLock() 方法不會遵守此公平設置,並將獲得鎖(如果可能),不考慮等待執行緒)。
此鎖允許 reader 和 writer 按照 ReentrantLock 的樣式重新獲取讀取鎖或寫入鎖。在寫入執行緒保持的所有寫入鎖都已經釋放後,才允許重入 reader 使用它們。
此外,writer 可以獲取讀取鎖,但反過來則不成立。在其他應用程序中,當在調用或回調那些在讀取鎖狀態下執行讀取操作的方法期間保持寫入鎖時,重入很有用。如果 reader 試圖獲取寫入鎖,那麼將永遠不會獲得成功。
重入還允許從寫入鎖降級為讀取鎖,其實作方式是:先獲取寫入鎖,然後獲取讀取鎖,最後釋放寫入鎖。但是,從讀取鎖升級到寫入鎖是不可能的。
讀取鎖和寫入鎖都支持鎖獲取期間的中斷。
Condition 支持
寫入鎖提供了一個 Condition 實作,對於寫入鎖來說,該實作的行為與 ReentrantLock.newCondition() 提供的 Condition 實作對 ReentrantLock 所做的行為相同。當然,此 Condition 只能用於寫入鎖。
讀取鎖不支持 Condition,readLock().newCondition() 會拋出 UnsupportedOperationException。
此類別支持一些確定是保持鎖還是爭用鎖的方法。這些方法設計用於監視系統狀態,而不是同步控制。
此類別行為的序列化方式與內置鎖的相同:反序列化的鎖處於解除鎖狀態,無論序列化該鎖時其狀態如何。
範例用法。下面的程式碼展示了如何利用重入來執行升級快取記憶體後的鎖降級(為簡單起見,省略了異常處理):
class CachedData {
Object data;
volatile boolean cacheValid;
ReentrantReadWriteLock rwl = new ReentrantReadWriteLock();
void processCachedData() {
rwl.readLock().lock();
if (!cacheValid) {
// Must release read lock before acquiring write lock
rwl.readLock().unlock();
rwl.writeLock().lock();
// Recheck state because another thread might have acquired
// write lock and changed state before we did.
if (!cacheValid) {
data = ...
cacheValid = true;
}
// Downgrade by acquiring read lock before releasing write lock
rwl.readLock().lock();
rwl.writeLock().unlock(); // Unlock write, still hold read
}
use(data);
rwl.readLock().unlock();
}
}
在使用某些種類別的 Collection 時,可以使用 ReentrantReadWriteLock 來提高共時性。通常,在預期 collection 很大,讀取者執行緒存取它的次數多於寫入者執行緒,並且 entail 操作的開銷高於同步開銷時,這很值得一試。例如,以下是一個使用 TreeMap 的類別,預期它很大,並且能被同時存取。
class RWDictionary {
private final Map<String, Data> m = new TreeMap<String, Data>();
private final ReentrantReadWriteLock rwl = new ReentrantReadWriteLock();
private final Lock r = rwl.readLock();
private final Lock w = rwl.writeLock();
public Data get(String key) {
r.lock();
try { return m.get(key); }
finally { r.unlock(); }
}
public String[] allKeys() {
r.lock();
try { return m.keySet().toArray(); }
finally { r.unlock(); }
}
public Data put(String key, Data value) {
w.lock();
try { return m.put(key, value); }
finally { w.unlock(); }
}
public void clear() {
w.lock();
try { m.clear(); }
finally { w.unlock(); }
}
}
此鎖最多支持 65535 個遞歸寫入鎖和 65535 個讀取鎖。試圖超出這些限制將導致鎖方法拋出 Error。
| 巢狀類別摘要 | |
|---|---|
static class |
ReentrantReadWriteLock.ReadLock
readLock() 方法返回的鎖。 |
static class |
ReentrantReadWriteLock.WriteLock
writeLock() 方法返回的鎖。 |
| 建構子摘要 | |
|---|---|
ReentrantReadWriteLock()
使用預設(非公平)的排序屬性創建一個新的 ReentrantReadWriteLock。 |
|
ReentrantReadWriteLock(boolean fair)
使用給定的公平策略創建一個新的 ReentrantReadWriteLock。 |
|
| 方法摘要 | |
|---|---|
protected Thread |
getOwner()
返回當前擁有寫入鎖的執行緒,如果沒有這樣的執行緒,則返回 null。 |
protected Collection<Thread> |
getQueuedReaderThreads()
返回一個 collection,它包含可能正在等待獲取讀取鎖的執行緒。 |
protected Collection<Thread> |
getQueuedThreads()
返回一個 collection,它包含可能正在等待獲取讀取或寫入鎖的執行緒。 |
protected Collection<Thread> |
getQueuedWriterThreads()
返回一個 collection,它包含可能正在等待獲取寫入鎖的執行緒。 |
int |
getQueueLength()
返回等待獲取讀取或寫入鎖的執行緒估計數目。 |
int |
getReadHoldCount()
查詢當前執行緒在此鎖上保持的重入讀取鎖數量。 |
int |
getReadLockCount()
查詢為此鎖保持的讀取鎖數量。 |
protected Collection<Thread> |
getWaitingThreads(Condition condition)
返回一個 collection,它包含可能正在等待與寫入鎖相關的給定條件的那些執行緒。 |
int |
getWaitQueueLength(Condition condition)
返回正等待與寫入鎖相關的給定條件的執行緒估計數目。 |
int |
getWriteHoldCount()
查詢當前執行緒在此鎖上保持的重入寫入鎖數量。 |
boolean |
hasQueuedThread(Thread thread)
查詢是否給定執行緒正在等待獲取讀取或寫入鎖。 |
boolean |
hasQueuedThreads()
查詢是否所有的執行緒正在等待獲取讀取或寫入鎖。 |
boolean |
hasWaiters(Condition condition)
查詢是否有些執行緒正在等待與寫入鎖有關的給定條件。 |
boolean |
isFair()
如果此鎖將公平性設置為 ture,則返回 true。 |
boolean |
isWriteLocked()
查詢是否某個執行緒保持了寫入鎖。 |
boolean |
isWriteLockedByCurrentThread()
查詢當前執行緒是否保持了寫入鎖。 |
ReentrantReadWriteLock.ReadLock |
readLock()
返回用於讀取操作的鎖。 |
String |
toString()
返回標識此鎖及其鎖狀態的字元串。 |
ReentrantReadWriteLock.WriteLock |
writeLock()
返回用於寫入操作的鎖。 |
| 從類別 java.lang.Object 繼承的方法 |
|---|
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait |
| 建構子詳細資訊 |
|---|
public ReentrantReadWriteLock()
ReentrantReadWriteLock。
public ReentrantReadWriteLock(boolean fair)
ReentrantReadWriteLock。
fair - 如果此鎖應該使用公平排序策略,則該參數的值為 true| 方法詳細資訊 |
|---|
public ReentrantReadWriteLock.WriteLock writeLock()
ReadWriteLock 複製的描述
ReadWriteLock 中的 writeLockpublic ReentrantReadWriteLock.ReadLock readLock()
ReadWriteLock 複製的描述
ReadWriteLock 中的 readLockpublic final boolean isFair()
true。
trueprotected Thread getOwner()
null。當通過不是所有者的執行緒調用此方法時,返回值反映當前鎖狀態的最接近近似值。例如,即使存在試圖獲得鎖的執行緒,但是在它還沒有獲得前,所有者可能暫時為 null。設計此方法是為了便於建構提供更多擴展的鎖監視設施的子類別。
nullpublic int getReadLockCount()
public boolean isWriteLocked()
true;否則返回 falsepublic boolean isWriteLockedByCurrentThread()
true;否則返回 falsepublic int getWriteHoldCount()
public int getReadHoldCount()
protected Collection<Thread> getQueuedWriterThreads()
protected Collection<Thread> getQueuedReaderThreads()
public final boolean hasQueuedThreads()
true 並不保證任何其他執行緒將獲取鎖。此方法主要用於監視系統狀態。
truepublic final boolean hasQueuedThread(Thread thread)
true 並不保證此執行緒將獲取鎖。此方法主要用於監視系統狀態。
thread - 執行緒
true
NullPointerException - 如果執行緒為 nullpublic final int getQueueLength()
protected Collection<Thread> getQueuedThreads()
public boolean hasWaiters(Condition condition)
true 並不保證將來某個 signal 將喚醒任何執行緒。此方法主要用於監視系統狀態。
condition - 條件
true
IllegalMonitorStateException - 如果沒有保持此鎖
IllegalArgumentException - 如果給定的條件與此鎖無關
NullPointerException - 如果條件為 nullpublic int getWaitQueueLength(Condition condition)
condition - 條件
IllegalMonitorStateException - 如果沒有保持此鎖
IllegalArgumentException - 如果給定的條件與此鎖無關
NullPointerException - 如果條件為 nullprotected Collection<Thread> getWaitingThreads(Condition condition)
condition - 條件
IllegalMonitorStateException - 如果沒有保持此鎖
IllegalArgumentException - 如果給定 condition 與此鎖無關
NullPointerException - 如果條件為 nullpublic String toString()
"Write locks =",後跟重入保持寫入鎖的數目,然後是字元串 "Read locks =",後跟所保持讀取鎖的數目。
Object 中的 toString
|
JavaTM 2 Platform Standard Ed. 6 |
|||||||||
| 上一個類別 下一個類別 | 框架 無框架 | |||||||||
| 摘要: 巢狀 | 欄位 | 建構子 | 方法 | 詳細資訊: 欄位 | 建構子 | 方法 | |||||||||
版權所有 2008 Sun Microsystems, Inc. 保留所有權利。請遵守GNU General Public License, version 2 only。