如何保證容器是線程安全的? ConcurrentHashMap 如何高效的線程安全?

如何保證容器是線程安全的? ConcurrentHashMap 如何高效的線程安全?

Java提供了不同層面的線程安全支持。在傳統集合框架內部,除了 Hashtable等同步容器,還提供了所謂的同步包裝器(Synchronized Wrapper),我們可以調用Collections工具類提供的包裝方法,來獲取一個同步的包裝容器(如 Collections.synchronizedMap),但是它們都是利用非常粗粒度的同步方式,在高併發情況下,性能比較低下。其實可以利用併發包提供的線程安全容器。

  • 各種併發容器,比如 ConcurrentHashMap、CopyOnWriteArrayList
  • 各種線程安全隊列(Queue/Deque),比如 ArrayBlockingQueue,SynchronousQueue
  • 各種有序容器的線程安全版本。

如何保證線程安全

首先要保障線程安全的幾個基本特性, 原子性,可見性,有序性。
其次可以通過封裝的方式將內部對象保護起來,保證變量對象的不可變性,一般就線程安全了。

  • 理解基本的線程安全工具
  • 理解傳統集合礦建併發變成中 Map 存在的問題,清楚簡單同步方式的不足
  • 梳理併發包內,尤其是 ConcurrentHashMap 採取了哪些方法來提高並發表現。
  • 最好能夠掌握 ConcurrentHashMap 自身的演進,目前很多分析資料還是基於早期版本。

爲什麼需要 ConcurrentHashMap

Hashtable 是怎樣實現線程安全的。

Hashtable 能夠保證線程安全,但是它的基本就是將 put ,get ,size 等各種操作加上 synchronized, 這樣就導致了所有併發操作都要競爭一把鎖

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章