java - 如果同时修改未 protected Java 集合会发生什么情况?

标签 java concurrency jvm

http://docs.oracle.com/javase/7/docs/api/java/util/LinkedList.html

Note that this implementation is not synchronized. If multiple threads access a linked list concurrently, and at least one of the threads modifies the list structurally, it must be synchronized externally.

如果不这样做会发生什么?您是否会导致 JVM 崩溃、引发异常或只是产生不一致的状态?

如果只有一个写入者但并发读取不 protected 怎么办?您是否仍然会崩溃并弄乱状态,或者只是产生不一致的读取?

这是特定于实现的,还是规范保证一定程度的安全性和/或原子性?

最佳答案

在多线程环境中使用不同步的集合会导致脏读(数据状态不一致)和ConcurrentModificationException等问题。 (主要是当一个线程修改了集合的内容,而另一个线程正在迭代它时)。

根据您的使用情况,这可能会导致您的应用程序崩溃或 deadlock (当一个线程由于上述原因被 JVM 关闭时,未捕获的异常)。更糟糕的是,它可能会导致难以追踪的棘手问题和错误结果。不过,它不会导致 JVM 本身崩溃。

我建议查看 java.util.concurrent包裹。您会发现各种各样的线程安全、高效的集合。它们中的大多数都具有弱一致迭代器,返回反射(reflect)迭代器创建时或创建后某个时刻集合状态的元素。这意味着它们不会抛出 ConcurrentModificationException,并且可以与其他操作同时进行。

有关 Java 内存模型及其保证的信息,请参阅 this (非常值得一读!)。

关于java - 如果同时修改未 protected Java 集合会发生什么情况?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17629012/

相关文章:

java - 使用 SBT 管理构建时启用 Java 断言

java - 检查几个正则表达式的字符串并说出哪个匹配

java - 如何理解 Java 中的 "Happens-before consistency is not sufficient"

java - 如何识别图像中选定的文本

java - 对基于 tomcat Web 应用程序的用户角色的只读访问

ios - 如何安全地使渲染与更新模型脱钩?

Scala SyncVar isDefined 标志的使用

java - 带 Swing 进度条的多线程

java - ReservedCodeCacheSize 和 InitialCodeCacheSize 是什么?

java - 如何使用 JUnit 和 Ant 运行测试?在同一个 JVM 中还是不同的 JVM 中?