首页 > Java > java教程 > 正文

COW机制已经相关类的介绍

不言
发布: 2019-03-02 14:28:40
转载
2681人浏览过

本篇文章给大家带来的内容是关于cow机制已经相关类的介绍,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

COW机制已经相关类

Vector和SynchronizedList

我们知道ArrayList是用于替代Vector的,Vector是线程安全的容器。因为它几乎在每个方法声明处都加了synchronized关键字来使容器安全。如果使用Collections.synchronizedList(new ArrayList())来使ArrayList变成是线程安全的话,也是几乎都是每个方法都加上synchronized关键字的,只不过它不是加在方法的声明处,而是方法的内部。

多线程下for循环迭代Vector或者SynchronizedList,进行delete和get操作会发生数组下标错误的异常。

在JDK5以后,Java推荐使用for-each(迭代器)来遍历我们的集合,好处就是简洁、数组索引的边界值只计算一次。如果使用for-each(迭代器)来做上面的操作,会抛出ConcurrentModificationException异常。

如果想要完美解决上面所讲的问题,我们可以在遍历前加锁:

遍历一下容器都要我加上锁,这这这不是要慢死了吗。的确是挺慢的。因为加锁粒度太大。

CopyOnWriteArrayList是同步List的替代品,CopyOnWriteArraySet是同步Set的替代品。

Hashtable、Vector加锁的粒度大(直接在方法声明处使用synchronized)ConcurrentHashMap、CopyOnWriteArrayList加锁粒度小(用各种的方式来实现线程安全,比如我们知道的ConcurrentHashMap用了cas锁、volatile等方式来实现线程安全..)JUC下的线程安全容器在遍历的时候不会抛出ConcurrentModificationException异常所以一般来说,我们都会使用JUC包下给我们提供的线程安全容器,而不是使用老一代的线程安全容器。

CopyOnWriteArrayList实现原理

CopyOnWriteArrayList是线程安全容器(相对于ArrayList),底层通过复制数组的方式来实现。CopyOnWriteArrayList在遍历的使用不会抛出ConcurrentModificationException异常,并且遍历的时候就不用额外加锁元素可以为null

通义万相
通义万相

通义万相,一个不断进化的AI艺术创作大模型

通义万相 596
查看详情 通义万相
/** 可重入锁对象 */
    final transient ReentrantLock lock = new ReentrantLock();
    /** CopyOnWriteArrayList底层由数组实现,volatile修饰 */
    private transient volatile Object[] array;

    final Object[] getArray() {
        return array;
    }
    final void setArray(Object[] a) {
        array = a;
    }
    // 初始化CopyOnWriteArrayList相当于初始化数组
    public CopyOnWriteArrayList() {
        setArray(new Object[0]);
    }
登录后复制

CopyOnWriteArrayList底层就是数组,加锁就交由ReentrantLock来完成。

通过代码我们可以知道:在add(),set(),remove() 的时候就上锁,并复制一个新数组,增加操作在新数组上完成,将array指向到新数组中,最后解锁。在修改时,复制出一个新数组,修改的操作在新数组中完成,最后将新数组交由array变量指向。写加锁,读不加锁

CopyOnWriteArrayList缺点

内存占用:如果CopyOnWriteArrayList经常要增删改里面的数据,经常要执行add()、set()、remove()的话,那是比较耗费内存的。

因为我们知道每次add()、set()、remove()这些增删改操作都要复制一个数组出来。

数据一致性:CopyOnWrite容器只能保证数据的最终一致性,不能保证数据的实时一致性。

从上面的例子也可以看出来,比如线程A在迭代CopyOnWriteArrayList容器的数据。线程B在线程A迭代的间隙中将CopyOnWriteArrayList部分的数据修改了(已经调用setArray()了)。但是线程A迭代出来的是原有的数据。

以上就是COW机制已经相关类的介绍的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:segmentfault网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号