24-常用的数据结构线程安全分析

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_38331606/article/details/84628780
  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

猜你喜欢

转载自blog.csdn.net/qq_38331606/article/details/84628780