注意:这些线程安全的集合类,指的是单个方法线程安全,多个方法组合可能就不安全了
讲的比较全的:
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
- CopyOnWriteArrayList和CopyOnWriteArraySet 原理
https://www.cnblogs.com/chafry/p/16770916.html