Java中的并发问题

Java 集合中的快速失败机制

有线程在遍历集合的同时,有另外线程进行了集合结构的修改,则会引发异常,异常是告知遍历集合的线程当前集合已经发生了改变[modcount++],要求重新获取遍历器迭代器的快速失败行为无法得到保证,因为一般来说,不可能对是否出现不同步并发修改做出 任 何 硬 性 保 证 。 快 速 失 败 迭 代 器 会 尽 最 大 努 力 抛 出ConcurrentModificationException,为提高这类迭代器的正确性而编写一个依赖于此异常的程序是错误的做法:迭代器的快速失败行为应该仅用于检测 bug。

它是 Java 集合的一种错误检测机制。当多个线程对集合进行结构上的改变的操作时有可能会产生 fail-fast 机制。记住是有可能,而不是一定。

两个线程同时修改 List,编程不会有问题,但是执行结果不可提前估算,所以不能使用ConcurrentModificationException 不会始终指出对象已经由不同线程并发修改,如果单线程违反了规则,同样也有可能会抛出该异常。

迭代器在调用 next()、remove()方法时都是调用 checkForComodification()方法,该方法主要就是检测 modCount == expectedModCount ? 若 不 等 则 抛 出
ConcurrentModificationException 异常,从而产生 fail-fast 机制。

解决并发修改问题的方法

使用同步处理----并发性
不能使用 wait 方法,因为会释放锁
使用并发集合 java.util.concurrent 包
特殊情况:在一个线程中遍历数据的同时进行修改
解决方案是:不要采用 List 中提供的 remove 方法,而是使用 Iterator 中提供的 remove方法,则不会再报异常
在这里插入图片描述
针对 List 的特殊迭代器 ListIterator
Iterator 只能单向遍历集合中的元素,只支持删除元素;而 ListIterator 可以双向遍历,并允许添加、修改和删除元素、

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值