java防止两个线程同时修改一个数据_# 多线程:为啥无法避免并发修改异常?(假设有两个线程,线程A,线程B),怎么避免并发修改异常?...

多线程:为啥无法避免并发修改异常?(假设有两个线程,线程A,线程B),怎么避免并发修改异常?

首先要明确你将哪个数据作为共享变量,

是ArrayList对象

迭代器对象iterator

其次有两种并发修改操作:

通过迭代器的remove修改源集合对象

通过源集合类的方法修改源集合对象

一.以ArrayList对象作为共享数据的情景:,

b8920b8f10bd6dd4d2ea561a873c291f.png

​并发修改操作1:如果在线程体中通过ArrayList生成迭代器对象iterator,此时实际情况有两个迭代器对象iterator,和一个ArrayList共享对象,三个对象。在线程A迭代的过程中,用源集合对象调用方法修改,源集合对象中的modCount+1,在下次线程A迭代器迭代的时候,校验(expectedModCount== modCount),迭代器中的expectedModCount由于还是之前生成迭代器的时候保存的值,校验结果抛出异常,即使线程体上了锁,只要发生了源集合对象调用方法修改,就会出现并发修改异常。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值