的线程安全机制-CopyOnWriteArrayList-深入解析其底层实现 (的线程安全机制有哪些)
ArrayList和List有什么区别?
ArrayList和List两者有以下主要区别:
【集合】List、Map、Set部分实现类是否线程安全
1.1 ArrayList 不是线程安全的。多线程情况下操作ArrayList 不是线性安全的,可能会抛出 并发修改异常。 1.2 Vector 是线程安全的。Vector对add和get方法都加了关键字synchronized修饰,所以是线程安全的,但是同一时间只能有一个线程访问进行读写,所以性能慢。
1.3 (List<T> list)通过Collections的synchronizedList静态方法,可以返归一个线程安全的SynchronizedList对象。SynchronizedList是Collections的静态内部类。
synchronizedLis 和 Vector的区别
1.4 CopyOnWriteArrayList<E>写入时复制(CopyOnWrite)思想 数据存放在一个Object数组中,在进行add和set操作时会上锁,同时copy一份原始的Object数组,在完成add和set操作后,重新setArray,释放锁。get操作没有加锁,如果读的时候有多个线程正在向CopyOnWriteArrayList添加数据,不会阻塞,读还是可以读到旧的数据。
一个测试各种List是否安全的例子:
2.1 HashMap<> 不是线程安全的。多线程情况下操作HashMap不是线性安全的,可能会抛出 并发修改异常。 HashMap就有点复杂了,1.7由数组+链表实现,1.8由数组+链表+红黑树实现,不深入了,得单独学。 2.2 ( new HashMap<>())通过Collections的synchronizedMap静态方法,可以返归一个线程安全的SynchronizedMap对象。SynchronizedMap是Collections的静态内部类。 get和put都加锁
2.3 class ConcurrentHashMap<K,V> 来自 ,支持检索的完全并发性和更新的高预期并发性的哈希表,单独学。 一个测试各种Map是否安全的例子:
3.1 class HashSet<E> 不是线程安全的。 HashSetd底层由HashMap实现,HashSet的add方法调用对的是HashMap的put方法,传输的key是将传入set的元素,传入的value是一个固定的Object对象。
3.2 class TreeSet<E>不是线程安全的。 3.3 (new HashSet<>())是线程安全的。 3.4 class CopyOnWriteArraySet<E>是线程安全的。 一个测试各种Set是否安全的例子:
免责声明:本文转载或采集自网络,版权归原作者所有。本网站刊发此文旨在传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及版权、内容等问题,请联系本网,我们将在第一时间删除。同时,本网站不对所刊发内容的准确性、真实性、完整性、及时性、原创性等进行保证,请读者仅作参考,并请自行核实相关内容。对于因使用或依赖本文内容所产生的任何直接或间接损失,本网站不承担任何责任。