请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

CopyOnWriteArrayList并发问题

老师,关于并发容器有个问题,这里以CopyOnWriteArrayList为例:
关于同步容器Vector,它本身每个方法是加了对象锁的,所以在同时操作单个方法时不存在任何问题,但是在一个线程循环遍历时,有其他线程对其进行了删改操作,就会引发不安全的问题,所以引入了并发容器CopyOnWriteArrayList,但是CopyOnWriteArrayList经测试好像也有这个问题
图片描述

正在回答

2回答

Jimin 2019-05-04 15:35:44

你好,你这个例子和课程里的例子其实是一样的,本质上是都对list做了一次remove操作后,然后又去访问remove之前最后一个元素。
这种问题的本质原因是:尽管容器每个操作是线程安全的,但容器保证不了多个操作时间的线程安全性,原因是同一个线程间的连续操作是不具备原子性的。只有保证了多个操作间的原子性,才能保证这时的线程安全性。

1 回复 有任何疑惑可以回复我~
  • 提问者 旭丶 #1
    既然也无法保证绝对安全,那么使用它的必要是什么呢?
    回复 有任何疑惑可以回复我~ 2019-05-04 15:47:56
  • Jimin 回复 提问者 旭丶 #2
    他只是java提供的类,是否使用它完全看场景需要,他本身每个操作都是线程安全的,但是很多人在使用他们时以为每个操作时线程安全的,就错误的认为多个线程安全的操作合在一起也是线程安全的。
    这里是特意介绍这个点,让大家能注意到这个误区。正常search那个方法涉及到了多个操作,如果要保证线程安全,是要保证多个操作的原子性,这时实际上是需要引入同步操作(synchronized、lock等)
    回复 有任何疑惑可以回复我~ 2019-05-04 17:54:49
  • 提问者 旭丶 回复 Jimin #3
    嗯,谢谢老师解答。刚才找到了它的正确使用,CopyOnWriteArrayList在使用正常的循环遍历时还是存在线程安全问题,但是在使用迭代器进行遍历时则没问题,获取到迭代器之后的所有更改对迭代器的使用没有任何影响,虽然无法实时的获取到最新数据,但也是解决了Vector遍历时线程安全问题。
    回复 有任何疑惑可以回复我~ 2019-05-04 23:28:43
提问者 旭丶 2019-05-04 11:37:40

测试图

https://img1.sycdn.imooc.com//szimg/5ccd08fb00011ee314421550.jpg

https://img1.sycdn.imooc.com//szimg/5ccd08fe00013adf20640868.jpg


0 回复 有任何疑惑可以回复我~
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信