[英]ConcurrentHashmap simultaneous write and get operations
我有一個關於ConcurrentHashMaps的問題。 可以說我有2個線程。 線程A嘗試從共享的ConcurrentHashMap獲取對象。 線程B清除共享映射。 如果線程A和線程B同時訪問共享資源會發生什么。 我搜索了文檔和網絡,找不到確定的答案,也嘗試自己做但無濟於事。
ConcurrentHashMap根據並發級別划分為不同的段 。 因此,不同的線程可以在java中同時訪問不同的段。
線程可以讀取由java中的其他一些線程鎖定的ConcurrentHashMap段嗎?
是。 當線程鎖定一個段進行更新時,它不會阻止它進行檢索(由get方法完成),因此其他一些線程可以讀取段(通過get方法),但是它可以在鎖定之前讀取數據。
對於諸如putAll之類的操作,並發檢索可能反映僅刪除一些條目。 對於諸如清除並發檢索之類的操作,可能反映僅刪除一些條目。
不能有兩個線程同時改變事物。 使用這種數據結構的全部意義在於它們阻止多個線程同時更新 “核心內部數據”。
有兩個線程在同樣的時間點更改地圖是不可能的。 因為ConcurrentHashMap中的代碼不允許兩個線程並行操作事物!
但是 :當一個線程只讀取時, 另一個線程正在更新該數據; 事情是不同的! 因為閱讀部分可以“進入”關鍵部分,即使它當前由另一個線程擁有。
文檔對此案非常清楚:
檢索操作(包括get)通常不會阻塞,因此可能與更新操作(包括put和remove)重疊。
因此,如果兩個線程同時使用資源但是一個正在讀取而另一個正在更新,則可以讀取不可用的資源。
有關更多信息,請查看文檔第2段
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.