簡體   English   中英

用ReentrantLock包裝ConcurrentHashMap讀寫操作是一個好習慣嗎?

[英]Is it a good practice to wrap ConcurrentHashMap read and write operations with ReentrantLock?

我認為在ConcurrentHashMap的實現中,已經使用了ReentrantLock。 因此,不需要使用ReentrantLock來訪問ConcurrentHashMap對象。 這只會增加更多的同步開銷。 任何意見?

你(或任何人)想要用它做什么? ConcurrentHashMap已經是線程安全的。 用額外的鎖定代碼包裝它只會顯着減慢它,因為

  1. 它不會鎖定讀取本身,
  2. 即使是寫入,您也很難在外部模仿其內部鎖定分區行為。

換句話說,添加額外的鎖定會顯着增加線程爭用的可能性(以及使記錄的讀取操作的線程安全保證更嚴格)。

ConcurrentHashMap提供的實現ConcurrentMap ,並提供一個非常有效的解決方案與線程安全協調吞吐量的問題。 它針對讀取進行了優化,因此即使在更新表時,檢索也不會阻塞(為此,合同規定檢索結果將反映在檢索開始之前完成的最新更新操作)。 更新通常也可以不受阻塞地進行,因為ConcurrentHashMap不是一個而是一組表,稱為段,每個表都可以獨立鎖定。 如果段的數量相對於訪問表的線程數足夠大,則每個段通常不會有多於一個正在進行的更新。

來自Java Generics and Collections,第16.4節。

ConcurrentHashMap的重點不在於鎖定對它的訪問/修改。 額外的鎖定只會增加開銷。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM