采纳答案成功!
向帮助你的同学说点啥吧!感谢那些助人为乐的人
老师,关于并发容器有个问题,这里以CopyOnWriteArrayList为例: 关于同步容器Vector,它本身每个方法是加了对象锁的,所以在同时操作单个方法时不存在任何问题,但是在一个线程循环遍历时,有其他线程对其进行了删改操作,就会引发不安全的问题,所以引入了并发容器CopyOnWriteArrayList,但是CopyOnWriteArrayList经测试好像也有这个问题 图片描述
你好,你这个例子和课程里的例子其实是一样的,本质上是都对list做了一次remove操作后,然后又去访问remove之前最后一个元素。这种问题的本质原因是:尽管容器每个操作是线程安全的,但容器保证不了多个操作时间的线程安全性,原因是同一个线程间的连续操作是不具备原子性的。只有保证了多个操作间的原子性,才能保证这时的线程安全性。
既然也无法保证绝对安全,那么使用它的必要是什么呢?
他只是java提供的类,是否使用它完全看场景需要,他本身每个操作都是线程安全的,但是很多人在使用他们时以为每个操作时线程安全的,就错误的认为多个线程安全的操作合在一起也是线程安全的。 这里是特意介绍这个点,让大家能注意到这个误区。正常search那个方法涉及到了多个操作,如果要保证线程安全,是要保证多个操作的原子性,这时实际上是需要引入同步操作(synchronized、lock等)
嗯,谢谢老师解答。刚才找到了它的正确使用,CopyOnWriteArrayList在使用正常的循环遍历时还是存在线程安全问题,但是在使用迭代器进行遍历时则没问题,获取到迭代器之后的所有更改对迭代器的使用没有任何影响,虽然无法实时的获取到最新数据,但也是解决了Vector遍历时线程安全问题。
测试图
登录后可查看更多问答,登录/注册
构建完整并发与高并发知识体系,倍增高薪面试成功率!
1.7k 1
1.1k 18
1.2k 15
3.6k 12
1.2k 12