【发布时间】:2016-03-11 22:45:17
【问题描述】:
想象以下场景:
我有一个标准的 Java ArrayList<String>。
此ArrayList<String> 由多个线程访问,没有显式同步,受以下约束:
- 可能同时发生多个读取(可能与下面描述的写入同时发生)。所有读取调用
ArrayList<String>上的iterator()方法并专门使用返回的Iterator<E>(迭代器不在线程之间共享)。在Iterator<String>上调用的唯一方法是hasNext()和next()(不调用remove()方法)。 - 一个线程可以写入列表(可能与读取并发,但与其他写入不并发)。每次写入仅调用
ArrayList<E>上的add(String)和remove(Object)方法。
我知道以下是正确的:
- 读取线程可能会看到过时的数据。
- 读取线程可能会遇到
ConcurrentModificationException。
除了以上两个问题,还有什么问题吗?
我正在寻找具体的例子(形式的,如果x和y为真,那么z会出现,其中z 不好)。它必须是可以在实践中实际发生的事情。请尽可能提供引用。
(我个人认为其他故障是可能的,但我一直受到挑战,无法提出为什么上述场景不适合生产代码的具体示例。)
【问题讨论】:
-
“除了以上两个问题,还有什么问题吗” -- 根据Javadoc,如果集合和/或迭代器没有快速失败,那么你对“任意的、不确定的行为”持开放态度,所以几乎一切皆有可能。
标签: java multithreading arraylist concurrency java-memory-model