最新的Yusi主题上线啦!

java 快速失败

java lzxianren 296℃ 0评论

什么是快速失败(fail-fast)

“快速失败”也就是 fail-fast,它是 Java 集合的一种错误检测机制。当多个线程对集合进行结构上的改变的操作时,有可能会产生 fail-fast 机制。记住是有可能,而不是一定。例如:假设存在两个线程(线程 1、线程 2),线程 1 通过 Iterator 在遍历集合 A 中的元素,在某个时候线程 2 修改了集合 A 的结构(是结构上面的修改,而不是简单的修改集合元素的内容),那么这个时候程序就会抛出 ConcurrentModificationException 异常,从而产生 fail-fast 机制。

一般来说,存在非同步的并发修改时,不可能作出任何坚决的保证。在迭代的时候,快速失败将尽最大努力抛出 ConcurrentModificationException。

实现原理

通过 modCount (修改次数)域来实现。

在通过 put 方法修改 Map 时,将 modCount (修改次数)域加 1: ++modCount;

在依次遍历迭代器 Iterator 时,判断 expectedModCount 是否与 modCount 相等:

如果不相等,就会抛出异常:ConcurrentModificationException 

意义

防止在多线程下对于集合修改和读取的不确定性,提醒程序员要注意线程安全的问题。

如何避免

  1. 避免在多线程环境下使用非线程安全的集合类;
  2. 在多线程环境下使用concurrent包下面的集合类,避免多线程问题。

转载请注明:程序员的自我修养 » java 快速失败

喜欢 (1)or分享 (0)
发表我的评论
取消评论
表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址