gpt4 book ai didi

java - 故障安全迭代器的逻辑是什么?

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:13:54 24 4
gpt4 key购买 nike

如果故障安全迭代器创建一个单独的副本并对其进行处理,它怎么会知道对原始副本所做的任何更改?

public class concurrentHashMap {
public static void main(String[] args) throws InterruptedException {
MapCheck obj1 = new MapCheck();
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
obj1.put();
}
});

Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
obj1.iterte();
}
});

t1.start();
t2.start();
t1.join();
t2.join();
}
}

class MapCheck {
Map<Integer,String> map = new ConcurrentHashMap<>();
{
map.put(1, "pujan");
map.put(2, "manish");
map.put(3, "swati");
}

void iterte() throws InterruptedException {
for (int key : map.keySet()) {
Thread.sleep(2000);
System.out.println(map.get(key));
}
}

void put() throws InterruptedException{
Thread.sleep(2000);
map.put(1, "pujan1");
map.put(2, "manish1");
map.put(3, "swati1");
}
}

输出是:

pujan1
manish1
swati1

最佳答案

Java 中没有“故障安全”迭代器这样的东西。至少,Java SE 规范没有定义这样的术语。因此,我建议您避免使用“故障安全”一词来描述 Java 迭代器。

我很清楚 Internet 和 Stack Overflow 上其他地方的各种文章都使用了“故障安全”一词,但它们的用法并不明确,而且很可能是不正确的或至少是误导性的。我相信您被此类文档误导了。

听起来您好像在某处读到“故障安全”迭代器在单独的副本上工作。在您的示例中,您使用了 ConcurrentHashMap,它确实具有并非快速失败的迭代器。但是,CHM 的迭代器不对副本进行操作。相反,它们具有官方规范描述为 weakly consistent 的语义。 .该定义有些深奥,但本质上,此类迭代器报告的任何元素都保证在某个时间点已存在于集合中。这些类型的迭代器可能反射(reflect)也可能不反射(reflect)迭代开始后对集合所做的更改。这就是为什么运行迭代器的线程会看到另一个线程所做的更改。 (也有可能某些更改不可见或不可见,因为这些线程存在数据竞争。)

另一个迭代器不是快速失败的集合的例子是 CopyOnWriteArrayList .此集合的迭代器对快照进行操作,因此对集合的任何后续更改都永远不会通过迭代器可见。

为了完整起见,这里是一个 fail-fast 的定义ArrayList 规范中的迭代器。 Java 中的大多数其他(非并发)集合都具有类似定义的快速失败迭代策略。

关于java - 故障安全迭代器的逻辑是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38341059/

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