24-常用的資料結構執行緒安全分析
阿新 • • 發佈:2018-12-05
- 常用的資料結構執行緒安全分析
執行緒安全的資料結構:Vector,Stack,Hashtable,ConcurrentHashMap
非執行緒安全的資料結構:ArrayList,LinkedList,ArrayQueue,HashMap,HashSet
-
- ArrayList非執行緒安全研究
- 測試程式碼
- 執行結果:
Exception in thread "Thread-0" java.lang.ArrayIndexOutOfBoundsException: 33
at java.util.ArrayList.add(
at com.thread.concurrent.list.ArrayListDemo$1.run(ArrayListDemo.java:20)
at java.lang.Thread.run(Thread.java:745)
10002
- 原因分析
ArrayList本質上為動態陣列,主要通過陣列的擴容來實現長度可變,但其add方法,未新增同步處理
-
- Vector 執行緒安全研究
- 原始碼
Add方法,添加了同步機制
-
- HashMap 非執行緒安全研究
- HashMap 非執行緒安全研究
- 測試程式碼
- 執行結果:小於20000 或者執行緒卡死
- 原因分析:
HashMap是一個儲存單向連結串列表頭Entry的陣列結構,當HashMap中資料長度達到閾值時,會Resize()擴容。該擴容是非執行緒安全的,可能會造成迴圈連結串列等情況,導致執行緒卡死。
-
- ConcurrentHashMap 執行緒安全研究
- 原因分析
ConcurrentHashMap是一個儲存Segment的陣列(該長度確定後不可改變),而每個Segment均採用了可重入鎖ReentrantLock,用於儲存一個儲存了單向連結串列表頭HashEntry的陣列結構。在resize()時,只對當前的Segment擴容處理。