当前位置: 首页>后端>正文

线程安全的集合

注意:这些线程安全的集合,指的是单个方法线程安全,多个方法组合可能就不安全了

讲的比较全的:
https://blog.csdn.net/qiukuqiuku/article/details/124484616

https://blog.csdn.net/TsuiXh/article/details/123503622
https://blog.csdn.net/qq_33789406/article/details/118736673

Collections.synchronizedList 原理:其实就是加了synchronized

https://www.jianshu.com/p/0b3e5df6fe57

一.List相关

① Vector
Vector是最古老的并发容器,其实现了List接口,方法都是默认加synchronized的,所以效率很低,现在基本不会用它。

②CopyOnWriteArrayList (java.util.concurrent.CopyOnWriteArrayList)
读时没影响不加锁,写时加锁,copy一个新list,然后扩展一个新元素,老引用指向新的。
原理:https://baijiahao.baidu.com/s?id=1693680818426335450&wfr=spider&for=pc

二.Set相关

① CopyOnWriteArraySet (java.util.concurrent.CopyOnWriteArrayList)
底层是数组,读时没影响不加锁,写时加锁,copy一个新list,然后扩展一个新元素,老引用指向新的。

三. Map相关

HashMap为什么线程不安全?
https://blog.csdn.net/huayushuangfei/article/details/121380703

①HashTable
和Vector一样古老的并发容器,其实现了Map接口,方法都是默认加synchronized的,效率低,基本也不用了。

② HashMap
HashMap的方法默认都是不加锁的,可以通过容器工具类的方法Collections.synchronizedMap(new HashMap<UUID, UUID>(),给它手动加锁,加锁后效率和HashTable差不多。

并发情况下可能会出现的问题:https://mikechen.cc/28162.html

③ ConcurrentHashMap:
https://blog.csdn.net/zycxnanwang/article/details/105424734
https://blog.csdn.net/gupaoedu_tom/article/details/124449788

jdk1.7: ConcurrentHashMap底层用的分段锁,所以其在效率上会有所提升,主要体现在读上面。由于它往里插的时候内部做了各种各样的判断,本来是链表的,到8之后又变成了红黑树,然后里面又做了各种各样的cas的判断,所以他往里插的数据相比HashTable还要低一点。

jdk1.8: 添加元素时首先会判断容器是否为空,
如果为空则使用 volatile 加 CAS 来初始化,
如果容器不为空,则根据存储的元素计算该位置是否为空。
如果根据存储的元素计算结果为空则利用 CAS 设置该节点

二. JUC包下面的集合

https://tool.4xseo.com/article/477368.html

  1. CopyOnWriteArrayList和CopyOnWriteArraySet 原理

https://www.cnblogs.com/chafry/p/16770916.html


https://www.xamrdz.com/backend/32x1923739.html

相关文章: