什么是集合线程不安全,怎么解决?

1、集合线程不安全,究竟是什么意思?

集合的线程安全问题发生在多线程下,当一个线程写操作还未完成时,其他线程就来读这个集合的数据,从而导java.util.ConcurrentModificationException异常。

2、怎么解决?

    2.1  Llist集合:Vector集合,加了synchronized锁,性能低,禁止使用

    2.2 使用Collections工具类的SynchronizedList()方法, 不推荐

    2.3  使用CopyOnWriteArrayList,写时复制技术


3、写时复制

每次写操作时(add、set)都会通过生成副本来修改,然后修改后将指针指向修改后的副本,这样就达到了读写分离。



CopyOnWriteArrayList  add()源码

                    

CopyOnWriteArrayList set()源码

每次往容器内添加元素时,不直接往当前的容器内添加,而是先将当前的容器进行拷贝,然后再复制出一个新的容器,长度为原来的长度加1,然后将添加的蒜素添加到新容器的最后一个位置上,然后把原来的引用指向新的容器。

这样的好处,写的过程中可以并发的读,而不需要加锁,属于读写分离的思想。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Java SE 基础: 封装、继承、多态 封装: 概念:就是把对象的属性和操作(或服务)结合为一个独立的整体,并尽...
    Jayden_Cao阅读 6,459评论 0 8
  • JAVA并发编程与高并发解决方案 - 并发编程 三 相关文章 JAVA并发编程与高并发解决方案 - 并发编程 一 ...
    chuIllusions丶阅读 7,720评论 1 7
  • 四个线程安全策略 1、线程限制: 一个被线程限制的对象,由线程独占,并且只能被占有它的线程修改 2、共享只读: 一...
    端碗吹水阅读 3,157评论 0 1
  • 秋风凉凉,跟豆豆嫲嫲一起带豆豆去老祖母的果园菜地摘菜!老祖母种了一大片的菜,有花生,有番薯,有芥菜,有萝卜。远近有...
    浣熊猫阅读 1,742评论 0 1
  • 在长沙没有去省博,没有打卡马王堆有点遗憾,所以,今天计划了湖北省博游,一大早就早早起床,预留好足够的时间。 公交车...
    禅木老师阅读 1,324评论 0 0

友情链接更多精彩内容