【发布时间】:2016-08-16 21:50:44
【问题描述】:
谁能向我解释在 java 中改变一个非线程安全且被多个线程使用的集合的后果?
【问题讨论】:
-
后果:Collection 的内部结构可能已损坏。
-
Nasal demons. 也就是说,恶魔可能会从你的鼻子里飞出来。
标签: java thread-safety
谁能向我解释在 java 中改变一个非线程安全且被多个线程使用的集合的后果?
【问题讨论】:
标签: java thread-safety
结果未定义且有些随机。
对于设计为快速失败的 JDK 集合,您可能会收到 ConcurrentModificationException。与任何其他类不同,这确实是集合线程安全特有的唯一结果。
可能会出现线程不安全类通常会出现的问题:
还有很多其他的可能性,但没有一个是令人愉快的。最糟糕的是,当系统受到压力时,这些事情往往会在生产中最常暴露出来。
简而言之,您可能不想这样做。
【讨论】:
最常见的结果是它看起来有效,但并非一直有效。
这可能意味着您遇到了问题
可能发生的事情是;
唯一的选择是;
【讨论】:
不保证数据结构的不变量。
例如: 如果线程 2 在线程 1 添加到 DS 时进行读取,则线程 1 可能会考虑添加了此元素,而线程 2 尚未看到该元素已添加。
有很多不是线程安全的数据结构,在多线程环境中仍然可以正常工作(即不抛出),并且它们甚至可能在某些情况下正确执行(例如,如果您没有执行任何操作)写入数据结构)。
为了完全理解这个主题,建议探索并发系统中发生的不同类别的错误:这个简短的文档似乎是一个好的开始。
【讨论】: