首页 > 解决方案 > 可以同时读取和写入 TreeMap 导致无限循环

问题描述

https://ivoanjo.me/blog/2018/07/21/writing-to-a-java-treemap-concurrently-can-lead-to-an-infinite-loop-during-reads/演示了多个并发写入者如何可能以创建循环的方式破坏 TreeMap,并且迭代结构成为无限循环。

当最多一个并发编写器同时迭代和写入时,是否也可能进入无限循环?如果不能,除了跳过元素、处理元素两次或抛出异常之外,还有其他ConcurrentModificationException事情吗?

标签: javaconcurrencytreemap

解决方案


当最多一个并发编写器同时迭代和写入时,是否也可能进入无限循环?

我会说一个谨慎的不:这些无限循环的发生是因为多个线程正在重新连接节点之间的关系,因此可能会产生冲突的更新。单个线程不会与自身发生冲突,因此不会发生这样的重新布线混淆。


但是,我对此没有信心 - 但我不需要这样: a 的这种用法TreeMap违反了文档:

如果多个线程同时访问一个映射,并且至少有一个线程在结构上修改了映射,则必须在外部进行同步。

如果您不进行外部同步,则行为未定义。类的实现者可以自由地以任何符合规范的方式实现类;并且一种方法可能会导致无限循环。

如果您在 a 中遇到无限循环TreeMap,那是一种症状,而不是根本原因 - 即对可变数据的非同步访问。这意味着也不能保证只读线程正在读取的值是正确的。


推荐阅读