2013-08-21 24 views

回答

71
readLock.lock(); 

這意味着,如果任何其他線程是寫作(即持有的寫鎖),然後停在這裏,直到沒有其他線程寫。

一旦授予鎖定,將不允許其他線程到寫入(即進行寫入鎖定),直到鎖定被釋放。


writeLock.lock(); 

這意味着,如果任何其他線程是閱讀,停在這裏等待,直到沒有其他線程讀取或寫入。

一旦鎖被授予,沒有其他的線程將被允許寫入(即採取一個讀或寫鎖定),直到鎖被釋放。


結合這些,你可以在一個時間安排只有一個線程有寫權限但很多讀者,只要你喜歡當一個線程正在寫,除了可以在同一時間讀取。

換句話說。每次你想從結構讀取,取一個讀取鎖定。每當你想,拿一個鎖。通過這種方式,只要沒有人正在閱讀(您可以想象您擁有獨家訪問權限),但只要沒有人在寫作,就可以有許多閱讀器在同一時間閱讀。

+1

+1很好的解釋。只是爲了澄清,「一」是指「線程」。 –

15

ReadWriteLock的文檔說明了這一點:

一個ReadWriteLock中維護一對相關的鎖,一個用於只讀操作,另一個用於寫入。只要沒有寫入器,讀取鎖可以由多個讀取器線程同時保存。寫鎖定是獨佔的。

所以你一次可以有很多讀者,但是隻有一個作家 - 而且作者也會阻止讀者閱讀。如果您有一些可以安全地從多個線程讀取的資源,並且其中讀取比寫入更普遍,但資源不是實際上是只讀,那麼這非常有用。 (如果沒有作家,閱讀是安全的,沒有必要的鎖都沒有。)

+1

如果有100個閱讀器,並且在1個作者想要獲得一個鎖之間該怎麼辦,那麼在這種情況下,讀者會被打斷?或作家必須等到當前讀者釋放鎖定。 – Vipin

+1

@Vipin:作家必須等待。 –

+0

現在你的答案是完美:) – Vipin

6

當一個線程獲取WriteLock,沒有其他線程可以獲取ReadLock也不是ReentrantReadWriteLock同一個實例的WriteLock,除非該線程釋放鎖定。但是,多個線程可以同時獲取ReadLock