JavaTM 2 Platform
Standard Ed. 6

java.util.concurrent.locks
類別 ReentrantReadWriteLock

java.lang.Object
  繼承者 java.util.concurrent.locks.ReentrantReadWriteLock
所有已實作的介面:
Serializable, ReadWriteLock

public class ReentrantReadWriteLock
extends Object
implements ReadWriteLock, Serializable

支持與 ReentrantLock 類似語義的 ReadWriteLock 實作。

此類別具有以下屬性:

此類別行為的序列化方式與內置鎖的相同:反序列化的鎖處於解除鎖狀態,無論序列化該鎖時其狀態如何。

範例用法。下面的程式碼展示了如何利用重入來執行升級快取記憶體後的鎖降級(為簡單起見,省略了異常處理):

 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

從以下版本開始:
1.5
另請參見:
序列化表格

巢狀類別摘要
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
 

建構子詳細資訊

ReentrantReadWriteLock

public ReentrantReadWriteLock()
使用預設(非公平)的排序屬性創建一個新的 ReentrantReadWriteLock


ReentrantReadWriteLock

public ReentrantReadWriteLock(boolean fair)
使用給定的公平策略創建一個新的 ReentrantReadWriteLock

參數:
fair - 如果此鎖應該使用公平排序策略,則該參數的值為 true
方法詳細資訊

writeLock

public ReentrantReadWriteLock.WriteLock writeLock()
從介面 ReadWriteLock 複製的描述
返回用於寫入操作的鎖。

指定者:
介面 ReadWriteLock 中的 writeLock
返回:
用於寫入操作的鎖。

readLock

public ReentrantReadWriteLock.ReadLock readLock()
從介面 ReadWriteLock 複製的描述
返回用於讀取操作的鎖。

指定者:
介面 ReadWriteLock 中的 readLock
返回:
用於讀取操作的鎖。

isFair

public final boolean isFair()
如果此鎖將公平性設置為 ture,則返回 true

返回:
如果此鎖將公平性設置為 ture,則返回 true

getOwner

protected Thread getOwner()
返回當前擁有寫入鎖的執行緒,如果沒有這樣的執行緒,則返回 null。當通過不是所有者的執行緒調用此方法時,返回值反映當前鎖狀態的最接近近似值。例如,即使存在試圖獲得鎖的執行緒,但是在它還沒有獲得前,所有者可能暫時為 null。設計此方法是為了便於建構提供更多擴展的鎖監視設施的子類別。

返回:
所有者;如果沒有所有者,則返回 null

getReadLockCount

public int getReadLockCount()
查詢為此鎖保持的讀取鎖數量。此方法設計用於監視系統狀態,而不是同步控制。

返回:
所保持的讀取鎖數量。

isWriteLocked

public boolean isWriteLocked()
查詢是否某個執行緒保持了寫入鎖。此方法設計用於監視系統狀態,而不是同步控制。

返回:
如果某個執行緒保持寫入鎖,則返回 true;否則返回 false

isWriteLockedByCurrentThread

public boolean isWriteLockedByCurrentThread()
查詢當前執行緒是否保持了寫入鎖。

返回:
如果當前執行緒保持寫入鎖,則返回 true;否則返回 false

getWriteHoldCount

public int getWriteHoldCount()
查詢當前執行緒在此鎖上保持的重入寫入鎖數量。對於與解除鎖操作不比對的每個鎖操作,writer 執行緒都會為其保持一個鎖。

返回:
當前執行緒保持的寫入鎖數量,如果當前執行緒從未保持過寫入鎖,則返回 0

getReadHoldCount

public int getReadHoldCount()
查詢當前執行緒在此鎖上保持的重入讀取鎖數量。對於與解除鎖操作不比對的每個鎖操作,reader 執行緒都會為其保持一個鎖。

返回:
當前執行緒保持的讀取鎖數量;如果當前執行緒從未保持過讀取鎖,則返回 0
從以下版本開始:
1.6

getQueuedWriterThreads

protected Collection<Thread> getQueuedWriterThreads()
返回一個 collection,它包含可能正在等待獲取寫入鎖的執行緒。因為在構成此結果的同時,實際的執行緒 set 可能不斷發生變化,所以返回的 collection 僅是盡力而為獲得的估計值。所返回 collection 的元素沒有特定的順序。設計此方法是為了便於建構提供更多擴展的鎖監視器設施的子類別。

返回:
執行緒的 collection

getQueuedReaderThreads

protected Collection<Thread> getQueuedReaderThreads()
返回一個 collection,它包含可能正在等待獲取讀取鎖的執行緒。因為在構成此結果的同時,實際的執行緒 set 可能不斷發生變化,所以返回的 collection 僅是盡力而為獲得的估計值。所返回 collection 的元素沒有特定的順序。設計此方法是為了便於建構提供更多擴展的鎖監視器設施的子類別。

返回:
執行緒的 collection

hasQueuedThreads

public final boolean hasQueuedThreads()
查詢是否所有的執行緒正在等待獲取讀取或寫入鎖。注意,因為隨時可能發生取消操作,所以返回 true 並不保證任何其他執行緒將獲取鎖。此方法主要用於監視系統狀態。

返回:
如果有其他執行緒正等待獲取鎖,則返回 true

hasQueuedThread

public final boolean hasQueuedThread(Thread thread)
查詢是否給定執行緒正在等待獲取讀取或寫入鎖。注意,因為隨時可能發生取消操作,所以返回 true 並不保證此執行緒將獲取鎖。此方法主要用於監視系統狀態。

參數:
thread - 執行緒
返回:
如果將給定的執行緒加入等待此鎖的佇列,則返回 true
拋出:
NullPointerException - 如果執行緒為 null

getQueueLength

public final int getQueueLength()
返回等待獲取讀取或寫入鎖的執行緒估計數目。因為在此方法遍歷內部資料結構時,可以動態地更改執行緒數,所以該值只能是一個估計值。此方法設計用於監視系統狀態,而不是同步控制。

返回:
正在等待此鎖的執行緒估計數目

getQueuedThreads

protected Collection<Thread> getQueuedThreads()
返回一個 collection,它包含可能正在等待獲取讀取或寫入鎖的執行緒。因為在建構此結果的同時,實際的執行緒 set 可能不斷發生變化,所以返回的 collection 僅是盡力而為獲得的估計值。所返回 collection 中的元素沒有特定的順序。此方法用於加快子類別的建構速度,提供更多的監視設施。

返回:
執行緒的 collection

hasWaiters

public boolean hasWaiters(Condition condition)
查詢是否有些執行緒正在等待與寫入鎖有關的給定條件。注意,因為隨時可能發生逾時和中斷,所以返回 true 並不保證將來某個 signal 將喚醒任何執行緒。此方法主要用於監視系統狀態。

參數:
condition - 條件
返回:
如果有等待的執行緒,則返回 true
拋出:
IllegalMonitorStateException - 如果沒有保持此鎖
IllegalArgumentException - 如果給定的條件與此鎖無關
NullPointerException - 如果條件為 null

getWaitQueueLength

public int getWaitQueueLength(Condition condition)
返回正等待與寫入鎖相關的給定條件的執行緒估計數目。注意,因為隨時可能發生逾時和中斷,所以只能將估計值作為實際等待執行緒數的上限。此方法設計用於監視系統狀態,而不是同步控制。

參數:
condition - 條件
返回:
等待執行緒的估計數
拋出:
IllegalMonitorStateException - 如果沒有保持此鎖
IllegalArgumentException - 如果給定的條件與此鎖無關
NullPointerException - 如果條件為 null

getWaitingThreads

protected Collection<Thread> getWaitingThreads(Condition condition)
返回一個 collection,它包含可能正在等待與寫入鎖相關的給定條件的那些執行緒。因為在建構此結果的同時,實際的執行緒 set 可能不斷發生變化,所以返回的 collection 僅是盡力而為獲得的估計值。所返回 collection 中的元素沒有特定的順序。此方法用於加快子類別的建構速度,提供更多的條件監視設施。

參數:
condition - 條件
返回:
執行緒的 collection
拋出:
IllegalMonitorStateException - 如果沒有保持此鎖
IllegalArgumentException - 如果給定 condition 與此鎖無關
NullPointerException - 如果條件為 null

toString

public 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