我正在研究java併發API並試圖理解讀寫鎖的有用性。 javadoc表示,一個readwrite塊維護一對鎖,一個用於讀取,另一個用於寫入操作。雖然寫鎖定是由線程獨佔訪問的,但多個線程可以獲取讀鎖定。因此,如果在讀取部分中,我們所做的只是讀取操作,而且我們無論如何都提供了多線程訪問,那麼首先需要使用readlock?有沒有一種情況,當讀寫鎖實際上有用?關於讀寫鎖的查詢
關於讀寫鎖的查詢
回答
....什麼是需要有readlock擺在首位
閱讀時,你需要防止作家獲取鎖......直到所有的讀者都結束了。但另一個閱讀器可以獲取鎖定。
在寫作時,您需要防止讀者獲取鎖定......直到作者完成。
(換句話說,也可以是一個作家,或者多個讀者持有鎖......但不能同時使用。)
爲了描述本的目的,它是有幫助的的行爲描述爲兩把鎖。什麼實際上發生在引擎蓋......是具體實現。
是否有一個場景,當讀寫鎖實際上是有用的?
好吧。在任何可以區分需要共享只讀訪問的線程和需要獨佔讀寫(或只寫)的線程的情況下,ReadWrite
鎖允許比簡單的Lock
或原語互斥更多的併發。
如果您正在閱讀許多主題中的數據,您可能不會看到由於可見性問題而導致的對數據的最新更改。有很多層可以在每個線程的基礎上緩存數據:不同層的CPU緩存,RAM訪問緩衝區等等。在你可能確定的地方,你可以閱讀鎖定,你總是在觀察最新的狀態。
寫入鎖更加強大,提供訪問的原子性以及最新更改的可見性。
這裏有不同類型的鎖的主要原因是有能力獲得足夠的同步水平,而不會爲其他線程引入太多開銷和鎖。
有沒有一種情況,當時讀寫鎖實際上有用?
當你有一些內存中的數據(數組,集合或其他)時,它會非常有用,而這些數據會被不同的線程查詢,但這種數據的更新很少發生。在這種情況下,具有單獨的鎖定(對查詢進行讀取鎖定和對更新進行寫入鎖定)可能會給您帶來顯着的性能優勢。
的原因有隻讀鎖是,如果一些其它線程鎖定寫作的對象,該對象的狀態可能是不一致的,所以你不想開始爲無鎖閱讀它。獲取讀鎖保證(1)對象是一致的狀態,而你看着它,因爲沒有其他線程正在修改它,(2),其它線程不能開始修改它,直到你通過看它。我們將讀鎖定作爲單獨的類型,因爲如果通常有很多線程可以讀取,但只有少量更新,那麼讀者可以同時查看。
- 1. sqlite:檢查讀寫器鎖
- 2. 讀寫鎖
- 3. Postgres寫/讀鎖
- 4. 讀寫鎖表
- 5. pthreads:讀寫器鎖,將讀鎖升級到寫鎖
- 6. PThreads:讀/寫鎖:如何檢查線程是否持有寫鎖?
- 7. 只使用關鍵部分的讀/寫鎖會導致死鎖
- 8. 由ReentrantReadWriteLock返回的鎖等於它的讀寫鎖嗎?
- 9. C++中的文件鎖定用於同時讀寫鎖
- 10. 關於git讀寫權限?
- 11. 關於使用讀寫
- 12. 無鎖讀寫器
- 13. 表鎖讀寫ALIAS
- 14. 關於C#線程鎖定的一個小查詢
- 15. 查詢關於在同步塊上重入鎖定的缺點
- 16. Perl中的讀寫鎖
- 17. 閱讀關於編寫最佳SQL數據庫查詢的材料
- 18. 關於SQL查詢?
- 19. 關於mysql查詢?
- 20. 關於查詢DB2
- 21. 關於SQL查詢
- 22. 關於sql查詢
- 23. 查詢關於PHP
- 24. 關於sql查詢
- 25. 關於SQL查詢
- 26. 關於SimpleDB查詢
- 27. 關於LoopBack查詢
- 28. Python寫有偏見的讀寫器鎖
- 29. Parse.com - 編寫關係查詢?
- 30. 關於mixinproperties的JCR查詢
您需要一個讀取鎖定,當線程持有寫入鎖定時,該讀取鎖定將會阻止。 –