5

以下是典型的讀寫器模式(大量的讀取和寫入數)的Java:的ReentrantReadWriteLock優先

private ReadWriteLock lock = new ReentrantReadWriteLock(); 
    private int value; 

    public void writeValue(int newValue){ 
     lock.writeLock().lock(); 
     try{ 
      this.value = newValue; 
     } 
     finally{ 
      lock.writeLock().unlock(); 
     } 
    } 

    public int readValue(){ 
     lock.readLock().lock(); 
     try{ 
      return value; 
     } 
     finally{ 
      lock.writeLock().unlock(); 
     } 
    } 

我想知道這是有可能有優先作家和讀者?例如,通常作家可能會等待很長時間(也許是永遠),如果有其他線程持續讀取鎖定,那麼是否有可能讓作者具有更高的優先級,所以每當作家來到時,它可以被認爲是高優先級(跳過)類似的東西。

回答

4

根據javadoc,jdk的實現確實有而不是有任何讀寫器的優先級。然而,如果你使用「公平」的實現,那麼按照fifo順序授予的鎖(仍然沒有讀者/寫入者偏好),所以至少將來的讀者不會阻止等待作者。

+0

您認爲此時還需要其他額外的併發收集嗎?像BlockingQueue?或併發PriortyQueue類似的東西? – peter 2012-08-12 19:25:58

+0

@ user1389813 - 是否爲您的需求提供足夠強有力的保證?考慮到讀者(在你的例子中)只是閱讀一個簡單的價值,我無法想象一個作家會被阻止等待現有讀者(可以同時進行)。 – jtahlborn 2012-08-12 19:34:53

+0

那麼你有什麼建議? – peter 2012-08-12 19:37:05

0

寫入鎖定實際上已經優先於讀取器鎖定。

如果線程想要讀取資源,只要沒有線程正在寫入資源,並且沒有線程請求對資源的寫入訪問權限就沒問題。通過向上設定寫入訪問請求的優先級,我們假設寫入請求比讀取請求更重要。

詳情請參考this excellent post

編輯:重要的是要注意,這適用於fair mode only。感謝@ jtahlborn!

+1

根據[javadoc](http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/locks/ReentrantReadWriteLock.html):「本課程不強制讀者或作家偏好排序鎖訪問「。您鏈接的文章是一個單獨的實現。 – jtahlborn 2012-08-12 19:11:53

+0

@jtahlborn 請繼續閱讀: 「試圖獲得公平讀取鎖定(非重複)的線程會阻止寫入鎖定或存在等待寫入器線程。 – Vitaliy 2012-08-12 19:17:21

+1

是的,對於_fair_版本,並不是_writer_優先級。請看我的答案。 – jtahlborn 2012-08-12 19:18:03