2017-08-31 19 views
0

我有這個(簡體)場景:的ReentrantReadWriteLock在同一線程

@Test 
public void testSameThread() throws InterruptedException { 
    ReentrantReadWriteLock rwlock = new ReentrantReadWriteLock(); 
    rwlock.readLock().lock(); 
    { 
     if (rwlock.writeLock().tryLock(50, TimeUnit.MILLISECONDS)) { 
      // long-running op 
      Thread.sleep(100); 
      rwlock.writeLock().unlock(); 
     } else { 
      fail(); 
     } 
    } 
    rwlock.readLock().unlock(); 
} 

首先,我獲取讀鎖,然後在同一個線程我試圖獲取寫鎖。我的假設是,因爲我在同一個線程上,應該獲取寫入鎖定。

首先,我的假設有什麼問題?那麼,可以使用什麼模式(標準的Java鎖定機制)來允許對同一個線程進行任意嵌套的讀/寫鎖定?

+0

你只是做一個假設,在這裏,你得到了它一個明確的答案,你的問題建議,當你希望有什麼不工作,請添加更多你的問題的細節,預期和觀察到的行爲是什麼?是什麼讓你說它不像你期望的那樣工作? – A4L

回答

0

你的假設沒有錯。事實上,這不是一個假設,而是一個有據可查的事實。從ReentrantReadWriteLock.WriteLock.lock()

收購,如果既不是讀也不會寫鎖被另一線程持有寫鎖

它不會重入,如果它,而在同一個線程獲得多次受阻。

¹In事實畢竟不是做到有據可查,見註釋部分

+0

那麼,這是WriteLock impl中的一個錯誤?我應該用什麼來代替? –

+0

不,這是您的代碼中的一個錯誤,如果您遇到不同的行爲。你是最薄弱的環節,而不是由人們寫得比你更聰明的久經考驗的JDK代碼。永遠不要在別人的代碼中假設一個錯誤,然後才能確定它不在你的代碼中。 – Kayaman

+0

代碼中的錯誤在哪裏(它並不那麼複雜)? –

相關問題