java - 在Java中使用HashMap时有哪些非线程安全的情况?

标签 java multithreading

在API文档中,我们可以看到:

If multiple threads access a hash map concurrently, and at least one of the threads modifies the map structurally, it must be
synchronized externally. (A structural modification is any operation
that adds or deletes one or more mappings; merely changing the value
 associated with a key that an instance already contains is not a
 structural modification.)

我在想“put”方法是否应该同步?只说结构改造。你能举出一些HashMap不安全的情况吗?而且我查看“HashTable”的源码,“get”方法也被同步了,为什么不只同步写操作呢?

最佳答案

有一个一般的经验法则:

如果您有多个线程访问集合并且至少有一个线程在某一时刻修改集合,则需要同步对集合的所有访问

如果你仔细想想,它就很清楚了:如果一个集合被修改另一个线程从中读取(例如迭代),则读取和写入操作可能会相互干扰(读取看到一个集合) 部分写入,例如已创建条目但尚未设置值或条目尚未正确链接)。

不受此限制的是一个线程创建和修改的集合,然后将其交给“世界”,但在发布其引用后从未对其进行修改。

关于java - 在Java中使用HashMap时有哪些非线程安全的情况?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23809129/

相关文章:

java - 如果超时间隔到期,Awaitility.await().atMost(...) 会导致程序退出?

java - 操作 HashMap 中的静态数据

c# - 您能否链接到使用 BackgroundWorker 而不将其作为组件放置在表单上的一个很好的示例?

python - 在 Python 中创建一个简单的聊天应用程序(套接字)

java - 机器人 : tabhost not rendering tabs

java - POJO 的 JUnit 测试

java - 如何从一个静态方法获取变量并在另一个方法中使用它们

multithreading - 网上学习多线程的来龙去脉有哪些 "must reads"?

java - 了解Java线程干扰

java - 如何使编写方法线程安全?