2 回答

TA貢獻(xiàn)1829條經(jīng)驗 獲得超6個贊
ConcurrentHashMap
是線程安全的數(shù)據(jù)結(jié)構(gòu)。如果您List<String>
在值中使用(不是線程安全的),ConcurrentHashMap
則List
不是線程安全的,因為兩個線程可以保護(hù)列表的引用,然后并行修改它。
ConcurrentHashMap
是線程安全的意味著它的操作put
和putAll
等是線程安全的。這并不意味著您用作其值的數(shù)據(jù)結(jié)構(gòu)也成為線程安全的。
如何做到這一點?
在你
List<String>
的.CopyOnWriteArrayList
ConcurrentHashMap
進(jìn)行自定義
List
并制作他們的所有方法Synchronized
。通過傳入將非線程安全轉(zhuǎn)換
List
為線程安全。List
Collections.synchronizedList(non-Thread safelist)

TA貢獻(xiàn)1798條經(jīng)驗 獲得超3個贊
我說我們可以為此目的使用 ConcurrentHashMap ..他們說好的..
也許沒關(guān)系,也許不行。這取決于key_1和key_2之間是否有特殊關(guān)系。
假設(shè)一個線程為 key_1 存儲了一個新值,然后就在它可以為 key_2 存儲相關(guān)值之前,它的時間片結(jié)束。然后另一個線程在第一個線程掛起時檢查 key_1 和 key_2 的值。它看到 key_1 的新值,但看到 key_2 的舊值。
在那一點上,第一個線程只完成了更新兩個鍵的一半是否重要?
插入 aConcurrentHashMap
將確保 map 數(shù)據(jù)結(jié)構(gòu)本身在多線程應(yīng)用程序中不會做任何有趣或錯誤的事情,但如果應(yīng)用程序依賴于這兩個鍵總是一起更新,那么你仍然需要某種顯式鎖定以確保它們始終一起更新。
添加回答
舉報