gpt4 book ai didi

java - 为什么从非同步集合读取时会发生 ConcurrentModificationException

转载 作者:行者123 更新时间:2023-12-02 01:47:58 25 4
gpt4 key购买 nike

我正在阅读 Brian Goetz 的 Java Concurrency in Practice。我在第 83 和 84 页上讨论了 ConcurrentModificationException。具体来说,他描述了如果有一个 Activity 迭代器迭代集合并且在该集合上调用另一个迭代器,那么 ConcurrentModificationException 会如何发生。

他给出了这段代码:

public class HiddenIterator{

@GuardedBy("this")
private final Set<Integer> set = new HashSet<Integer>();

public synchronized void add(Integer i){ set.add(i); }
public synchronized void remove(Integer i){ set.remove(i); }

public void addTenThings(){
Random r = new Random();
for(int i = 0; i < 10; i++)
add(r.nextInt());
System.out.println("DEBUG: added ten elements to set " + set)
}
}

他注意到 println 语句中的字符串连接实际上是一个迭代器。我想知道的是这里的快速失败行为是如何工作的,因为这里的迭代器不会修改集合。它只读取集合而不触及集合的状态。当有另一个迭代器在集合上操作时,为什么会抛出 ConcurrentModificationException?它显然与异常的名称相矛盾,异常的名称表示并发修改。

显然,即使在读取时也抛出 ConcurrentModificationException 的选择与 Iterator 的实现细节有关。为什么选择这个实现?如果有人能够勾勒出这个实现的细节,即使在读取时也会导致 ConcurrentModificationException 抛出,那就太好了。

最佳答案

What I want to know is how the fail-fast behavior here works, since the iterator here does not modify the collection.

在迭代期间,有人调用 addremove 可能会修改该集合,因为 addTenThings 未同步。在这种情况下,迭代可能会抛出 ConcurrentModificationException。请记住,所有读取和写入都必须由同一锁保护。

关于java - 为什么从非同步集合读取时会发生 ConcurrentModificationException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57444643/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com