2013-08-12 70 views
5

我正在研究java併發API並試圖理解讀寫鎖的有用性。 javadoc表示,一個readwrite塊維護一對鎖,一個用於讀取,另一個用於寫入操作。雖然寫鎖定是由線程獨佔訪問的,但多個線程可以獲取讀鎖定。因此,如果在讀取部分中,我們所做的只是讀取操作,而且我們無論如何都提供了多線程訪問,那麼首先需要使用readlock?有沒有一種情況,當讀寫鎖實際上有用?關於讀寫鎖的查詢

+0

您需要一個讀取鎖定,當線程持有寫入鎖定時,該讀取鎖定將會阻止。 –

回答

3

....什麼是需要有readlock擺在首位

閱讀時,你需要防止作家獲取鎖......直到所有的讀者都結束了。但另一個閱讀器可以獲取鎖定。

在寫作時,您需要防止讀者獲取鎖定......直到作者完成。

(換句話說,也可以是一個作家,或者多個讀者持有鎖......但不能同時使用。)

爲了描述本的目的,它是有幫助的的行爲描述爲兩把鎖。什麼實際上發生在引擎蓋......是具體實現。


是否有一個場景,當讀寫鎖實際上是有用的?

好吧。在任何可以區分需要共享只讀訪問的線程和需要獨佔讀寫(或只寫)的線程的情況下,ReadWrite鎖允許比簡單的Lock或原語互斥更多的併發。

3

如果您正在閱讀許多主題中的數據,您可能不會看到由於可見性問題而導致的對數據的最新更改。有很多層可以在每個線程的基礎上緩存數據:不同層的CPU緩存,RAM訪問緩衝區等等。在你可能確定的地方,你可以閱讀鎖定,你總是在觀察最新的狀態。

寫入鎖更加強大,提供訪問的原子性以及最新更改的可見性。

這裏有不同類型的鎖的主要原因是有能力獲得足夠的同步水平,而不會爲其他線程引入太多開銷和鎖。

有沒有一種情況,當時讀寫鎖實際上有用?

當你有一些內存中的數據(數組,集合或其他)時,它會非常有用,而這些數據會被不同的線程查詢,但這種數據的更新很少發生。在這種情況下,具有單獨的鎖定(對查詢進行讀取鎖定和對更新進行寫入鎖定)可能會給您帶來顯着的性能優勢。

1

的原因有隻讀鎖是,如果一些其它線程鎖定寫作的對象,該對象的狀態可能是不一致的,所以你不想開始爲無鎖閱讀它。獲取讀鎖保證(1)對象是一致的狀態,而你看着它,因爲沒有其他線程正在修改它,(2),其它線程不能開始修改它,直到你通過看它。我們將讀鎖定作爲單獨的類型,因爲如果通常有很多線程可以讀取,但只有少量更新,那麼讀者可以同時查看。