集合的线程安全

 

CopyOnWriteArrayList

集合的线程安全

写入时先Copy一个容器副本,再添加新元素,最后替换引用。

1、如果写操作未完成,那么直接读取原数组的数据;

2、如果写操作完成,但是引用还未指向新数组,那么也是读取原数组数据;

3、如果写操作完成,并且引用已经指向了新的数组,那么直接从新数组中读取数据。 

这样子就读写不互斥,效率很高,此时是写有锁,读没锁。优于读写锁,因为读写锁是互斥的

 

 ConcurrentHashMap

一、什么是ConcurrentHashMap?为什么要引ConcurrentHashMap?

    1、HashMap线程是不安全,它的线程不安全主要发生在put等对HashEntry有直接写操作的地方:

        HashMap线程不安全主要可能发生在这两个地方:

                * key已经存在,需要修改HashEntry对应的value;

                * key不存在,在HashEntry中做插入。

 

    2、Hashtable线程安全,但是效率低下:
               Hashtable是用synchronized关键字来保证线程安全的,但synchronized的机制是在同一时刻只能有

        一个线程操作,其他的线程阻塞或者轮询等待,在线程竞争激烈的情况下,这种方式的效率会非常的低下。


    ConcurrentHashMap是线程安全并且高效的HashMap,在并发编程中经常可见它的使用。

二、ConcurrentHashMap为什么高效?
    Hashtable效率低的原因是所有访问Hashtable的线程都争夺一把锁。


    如果容器有很多把锁,每一把锁控制容器中的一部分数据,那么当多个线程访问容器里的不同部分的数据时,线程之前就不会存在锁的竞争,这样就可以有效的提高并发的访问效率。


    这也正是ConcurrentHashMap使用的分段锁技术。将ConcurrentHashMap容器的数据分段存储,每一段数据分配一个Segment(锁),当线程占用其中一个Segment时,其他线程可正常访问其他段数据。

三、ConcurrentHashMap里为什么分segment

        这正是ConcurrentHashMap高明之处,我们都知道锁只在segment中存在,这样就把锁的粒度变小,提高并发,同时还是线程安全的,

ConcurrentHashMap的结构图:

集合的线程安全
        * Segment是可重入锁,它在ConcurrentHashMap中扮演   分离锁的角色;
        * HashEntry主要存储键值对;
      * ConcurrentHashMap包含一个Segment数组,每个Segment包含一个HashEntry数组并且守护它,当修改HashEntry  数组数据时,需要先获取它对应的Segment锁;而HashEntry数组采用开链法处理冲突,所以它的每个HashEntry元素又是链表结构的元素。
————————————————
版权声明:本文为CSDN博主「随_0204」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_39541319/article/details/80638934

相关文章: