java - 可以同时读取和写入 TreeMap 导致无限循环
问题描述
https://ivoanjo.me/blog/2018/07/21/writing-to-a-java-treemap-concurrently-can-lead-to-an-infinite-loop-during-reads/演示了多个并发写入者如何可能以创建循环的方式破坏 TreeMap,并且迭代结构成为无限循环。
当最多一个并发编写器同时迭代和写入时,是否也可能进入无限循环?如果不能,除了跳过元素、处理元素两次或抛出异常之外,还有其他ConcurrentModificationException
事情吗?
解决方案
当最多一个并发编写器同时迭代和写入时,是否也可能进入无限循环?
我会说一个谨慎的不:这些无限循环的发生是因为多个线程正在重新连接节点之间的关系,因此可能会产生冲突的更新。单个线程不会与自身发生冲突,因此不会发生这样的重新布线混淆。
但是,我对此没有信心 - 但我不需要这样: a 的这种用法TreeMap
违反了文档:
如果多个线程同时访问一个映射,并且至少有一个线程在结构上修改了映射,则必须在外部进行同步。
如果您不进行外部同步,则行为未定义。类的实现者可以自由地以任何符合规范的方式实现类;并且一种方法可能会导致无限循环。
如果您在 a 中遇到无限循环TreeMap
,那是一种症状,而不是根本原因 - 即对可变数据的非同步访问。这意味着也不能保证只读线程正在读取的值是正确的。
推荐阅读
- python - 如何使用python从文件夹中发送所有文件?
- visual-studio - 为 iis 上托管的 webforms 项目调试 javascript
- android - 如何在android中为高优先级通知覆盖静音/静音和振动
- amazon-web-services - 使用 CloudFormation 更新 DynamoDB 的 TimeToLiveSpecification
- python - 为什么在以图像为背景的不同 Tkinter 画布之间切换时会出现快速的白色闪烁?
- flask - 联系人无法为映射表组装任何主键列
- sql - Oracle SQL 数据库表列重要性
- google-chrome - 这些恶意代码在我的 chrome 浏览器的所有页面中
- node.js - Angular/ MongoDB/ NodeJs:从一个域自动登录到另一个域
- react-native - TypeError:在使用 createAsyncThunk 和 createSlice 时无法读取 redux 工具包中未定义的属性“待定”(@reduxjs/toolkit”:“^1.4.0)