Joh*_*ugh 3 java multithreading hashmap thread-safety
java.util.HashMap 的文档明确指出:“如果多个线程同时访问哈希映射,并且至少有一个线程在结构上修改了映射,则必须进行外部同步”。
但是,请考虑使用映射作为缓存来减少不可变对象创建的用例,其中仅在 HashMap 上调用computeIfAbsent(不删除/驱逐)。你唯一关心的是computeIfAbsent返回一个有效的对象;您不关心computeIfAbsent是否偶尔会产生额外的对象或覆盖现有条目。
可能发生的最坏情况是什么?在我的随意测试中,没有产生任何负面后果。(我会使用 ConcurrentHashMap,但在这个用例中它相对较慢。)
这里的问题是:如果有的话,线程安全将是一个实现细节。它可能恰好适用于一个 JVM 版本,但略有不同,或者在 java.util.HashMap 的某些其他版本中“关闭”。
引用另一个答案:
话虽这么说,最常用的 Map 实现,特别是 HashMap 不是线程安全的。从不同线程添加元素可能会使映射处于不一致的状态,例如,尽管 size() 显示元素存在,但无法检索已插入的元素。
换句话说:即使您今天没有遇到问题,从理论上讲,仅切换到不同的 java 版本也可能导致您的设计失败。
请记住:您拥有的唯一保证是 Map 接口。您使用的容器具有一些由多个线程更新的内部结构。如果这恰好不会导致不一致,那么这纯粹是巧合。
如果读取和写入 HashMap 在多线程设置中“正常工作”,那么为什么首先需要 ConcurrentHashMap?!
| 归档时间: |
|
| 查看次数: |
3650 次 |
| 最近记录: |