java中CopyOnWriteArrayList是线程安全的吗?

书欣 Java每日一问 发布时间:2022-09-27 22:27:54 阅读数:11081 1
下文是笔者采用示例验证CopyOnWriteArraylist是否为线程安全的?
CopyOnWriteArrayList是线程安全的

CopyOnWriteArrrayList的实现原理

1. CopyOnWriteArrayList实现了List接口,因此它是一个队列。
2. CopyOnWriteArrayList包含了成员lock。
  每一个CopyOnWriteArrayList都和一个监视器锁lock绑定,
    通过lock,实现了对CopyOnWriteArrayList的互斥访问。
3. CopyOnWriteArrayList包含了成员array数组,
    这说明CopyOnWriteArrayList本质上通过数组实现的。
4.CopyOnWriteArrayList的“动态数组”机制
    它内部有个“volatile数组”(array)来保持数据。在“添加/修改/删除”数据时
	 都会新建一个数组,并将更新后的数据拷贝到新建的数组中
	 最后再将该数组赋值给“volatile数组”。这就是它叫做CopyOnWriteArrayList的原因
	 CopyOnWriteArrayList就是通过这种方式实现的动态数组
	 不过正由于它在“添加/修改/删除”数据时,都会新建数组,所以涉及到修改数据的操作
	 CopyOnWriteArrayList效率很 低;但是单单只是进行遍历查找的话,效率比较高。
5.CopyOnWriteArrayList的“线程安全”机制 -- 是通过volatile和监视器锁Synchrnoized来实现的。
6.CopyOnWriteArrayList是通过“volatile数组”来保存数据的
一个线程读取volatile数组时,总能看到其它线程对该volatile变量最后的写入
 通过volatile提供了“读取到的数据总是最新的”这个机制的 保证。
7.CopyOnWriteArrayList通过监视器锁Synchrnoized来保护数据
  在“添加/修改/删除”数据时,会先“获取监视器锁”
   再修改完毕之后,先将数据更新到“volatile数组”中
   然后再“释放互斥锁”
   采用此种方法,可使数据更安全
例:
package com.java265;
import java.util.concurrent.CopyOnWriteArrayList;
public class TestJUC {
    public static void main(String[] args) {
        CopyOnWriteArrayList<String> list = new CopyOnWriteArrayList<>();
        for (int i = 0; i < 10000; i++) {
            new Thread(()->{
               list.add(Thread.currentThread().getName());
            }).start();
        }
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(list.size());
    }
}
版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。

本文链接: https://www.Java265.com/JavaProblem/202209/4535.html

最近发表

热门文章

好文推荐

Java265.com

https://www.java265.com

站长统计|粤ICP备14097017号-3

Powered By Java265.com信息维护小组

使用手机扫描二维码

关注我们看更多资讯

java爱好者