1. 程式人生 > >24-常用的資料結構執行緒安全分析

24-常用的資料結構執行緒安全分析

  1. 常用的資料結構執行緒安全分析

執行緒安全的資料結構:Vector,Stack,Hashtable,ConcurrentHashMap

非執行緒安全的資料結構:ArrayList,LinkedList,ArrayQueue,HashMap,HashSet

    1. ArrayList非執行緒安全研究
  • 測試程式碼

  • 執行結果:

Exception in thread "Thread-0" java.lang.ArrayIndexOutOfBoundsException: 33

at java.util.ArrayList.add(

ArrayList.java:441)

at com.thread.concurrent.list.ArrayListDemo$1.run(ArrayListDemo.java:20)

at java.lang.Thread.run(Thread.java:745)

10002

  • 原因分析

ArrayList本質上為動態陣列,主要通過陣列的擴容來實現長度可變,但其add方法,未新增同步處理

    1. Vector 執行緒安全研究
  • 原始碼

Add方法,添加了同步機制

    1. HashMap  非執行緒安全研究
  • 測試程式碼

  • 執行結果:小於20000 或者執行緒卡死
  • 原因分析:

HashMap是一個儲存單向連結串列表頭Entry的陣列結構,當HashMap中資料長度達到閾值時,會Resize()擴容。該擴容是非執行緒安全的,可能會造成迴圈連結串列等情況,導致執行緒卡死。

    1. ConcurrentHashMap  執行緒安全研究
  • 原因分析

ConcurrentHashMap是一個儲存Segment的陣列(該長度確定後不可改變),而每個Segment均採用了可重入鎖ReentrantLock,用於儲存一個儲存了單向連結串列表頭HashEntry的陣列結構。在resize()時,只對當前的Segment擴容處理。

 

多執行緒學習大綱:https://mp.csdn.net/postedit/84768644