如何保證容器是線程安全的? ConcurrentHashMap 如何高效的線程安全?
Java提供了不同層面的線程安全支持。在傳統集合框架內部,除了 Hashtable等同步容器,還提供了所謂的同步包裝器(Synchronized Wrapper),我們可以調用Collections工具類提供的包裝方法,來獲取一個同步的包裝容器(如 Collections.synchronizedMap),但是它們都是利用非常粗粒度的同步方式,在高併發情況下,性能比較低下。其實可以利用併發包提供的線程安全容器。
- 各種併發容器,比如 ConcurrentHashMap、CopyOnWriteArrayList
- 各種線程安全隊列(Queue/Deque),比如 ArrayBlockingQueue,SynchronousQueue
- 各種有序容器的線程安全版本。
如何保證線程安全
首先要保障線程安全的幾個基本特性, 原子性,可見性,有序性。
其次可以通過封裝的方式將內部對象保護起來,保證變量對象的不可變性,一般就線程安全了。
- 理解基本的線程安全工具
- 理解傳統集合礦建併發變成中 Map 存在的問題,清楚簡單同步方式的不足
- 梳理併發包內,尤其是 ConcurrentHashMap 採取了哪些方法來提高並發表現。
- 最好能夠掌握 ConcurrentHashMap 自身的演進,目前很多分析資料還是基於早期版本。
爲什麼需要 ConcurrentHashMap
Hashtable 是怎樣實現線程安全的。
Hashtable 能夠保證線程安全,但是它的基本就是將 put ,get ,size 等各種操作加上 synchronized, 這樣就導致了所有併發操作都要競爭一把鎖