当前位置:首页 > 数码 > 的线程安全机制-CopyOnWriteArrayList-深入解析其底层实现 (的线程安全机制有哪些)

的线程安全机制-CopyOnWriteArrayList-深入解析其底层实现 (的线程安全机制有哪些)

admin4个月前 (05-13)数码28
在上一篇文章中,我们了解到 ArrayList 不是线程安全的,而 CopyOnWriteArrayList 却是一个线程安全的集合。这不禁让我们产生了一些疑问: - CopyOnWriteArrayList 是如何实现线程安全的? - 它与 ArrayList 有什么不同? - 它的内部结构是如何设计的? 带着这些问题,让我们深入分析 CopyOnWriteArrayList 的源码。 CopyOnWriteArrayList 是一种线程安全的 ArrayList,底层是基于数组实现的。它的特点在于,在对其进行修改操作时,会复制一个新的 ArrayList,并在新的 ArrayList 上进行修改操作,从而不会影响旧的 ArrayList 的读操作。 CopyOnWriteArrayList 的内部结构非常简单,主要包括以下部分: - `ReentrantLock`:用于保证线程安全。 - `volatile Object[] array`:存储元素的数组。 当我们调用 Copy

ArrayList和List有什么区别?

ArrayList和List两者有以下主要区别:

【集合】List、Map、Set部分实现类是否线程安全

CopyOnWriteArrayList

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是否安全的例子:

免责声明:本文转载或采集自网络,版权归原作者所有。本网站刊发此文旨在传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及版权、内容等问题,请联系本网,我们将在第一时间删除。同时,本网站不对所刊发内容的准确性、真实性、完整性、及时性、原创性等进行保证,请读者仅作参考,并请自行核实相关内容。对于因使用或依赖本文内容所产生的任何直接或间接损失,本网站不承担任何责任。