簡體   English   中英

ConcurrentHashmap同時執行write和get操作

[英]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.

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