线程安全的集合

五迷三道 提交于 2020-03-17 01:02:26

集合

#集合大概有4种类型:List   Set   Queue  Map

其中Vector、HashTable、Properties是线程安全的。其中ArrayList、LinkedList、HashSet、TreeSet、HashMap、TreeMap等都是线程不安全的。(线程不安全是指:当多个线程访问同一个集合或Map时,如果有超过一个线程修改了ArrayList集合,则程序必须手动保证该集合的同步性。)

Collections提供多个获取线程安全的集合

在这里插入图片描述

CopyOnWriteArraylist

 #写有锁 读无锁的集合 加强版的读写分离 );

其实现的原理为 :
写操作原理 :将底层的数组做了一次复制,写的是新数组 完成了赋值之后再讲新数组替换旧数组 每调用一次写 底层数组都会扩容一次 ,
读操作原理 :读的是写操作完成之前的旧数组 ,写完成之后才能读到新数组的赋值。

CopyOnWriteArraySet(

 #序  无下标 元素不允许重复 

线程安全的Set集合底层使用CopyOnWriteArraylist实现,不同的是在使用addIfAbsent() 添加元素,会遍历数组 ,如果有存在的元素则不添加 。
其实现的原理为 :
表面上使用add方法,底层使用的是CopyOnWriteArraylist的addIfAbsent() 来判断要插入的新值是否存在

ConcurrentHashMap

 #   底层原理分两种 1.7和1.8版本

1.7 版本:初始容量为16段(Segment)为每个段加锁 当多个对象存入同一个段时 才需要互斥 使用方式与Hashmap无异

其实现的原理: 原理:使用分段锁 当多线程去访问其中的一个段时 如果是空值 直接赋上 ,如果有值 则去判断Key如果相同则覆盖 不相同 则存在最后一个值的next上面

   1.8版本:通过CA原理:同步锁锁的是标头对象 

,拿到锁的对象要先做节点遍历,查看有没有相同的Key值相同覆盖 不同则挂在最后一个节点上面的next上面
S交换算法和同步算法

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!