版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_38331606/article/details/84628780
- 常用的数据结构线程安全分析
线程安全的数据结构:Vector,Stack,Hashtable,ConcurrentHashMap
非线程安全的数据结构:ArrayList,LinkedList,ArrayQueue,HashMap,HashSet
-
- 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方法,未添加同步处理
-
- Vector 线程安全研究
- 源码
Add方法,添加了同步机制
-
- HashMap 非线程安全研究
- 测试代码
- 执行结果:小于20000 或者线程卡死
- 原因分析:
HashMap是一个存储单向链表表头Entry的数组结构,当HashMap中数据长度达到阈值时,会Resize()扩容。该扩容是非线程安全的,可能会造成循环链表等情况,导致线程卡死。
-
- ConcurrentHashMap 线程安全研究
- 原因分析
ConcurrentHashMap是一个存储Segment的数组(该长度确定后不可改变),而每个Segment均采用了可重入锁ReentrantLock,用于存储一个存储了单向链表表头HashEntry的数组结构。在resize()时,只对当前的Segment扩容处理。