我有一个C ++背景,据我所知,对std::map的并发写入访问会产生非常不愉快的后果,使用java.util.HashMap的Java情况如何?

请注意,我想知道在明显的比赛状况之外是否还有不良的副作用。

据我了解,仅当您在从另一个线程修改它的同时循环访问ConcurrentAccessException时,才会抛出java.util.HashMap,这是否意味着在另一个线程正在调用get的情况下简单地调用put方法是安全的cc>(“安全”是指可能发生的最糟糕的事情是您检索了错误的值)?

是否可能以类似方式导致SEGFAULT?

请注意,“相似”是指仅涉及纯Java方法/对象的竞争条件(没有JNI内容)

最佳答案

首先,永远不要那样做,将地图包装在Collections.synchronizedMap中就很容易了。

内部状态可能会损坏,这可能导致以下任何情况:

[编辑]两个新项目(前两个)


内存泄漏,因为密钥进入错误的存储桶,并且除非执行clear(),否则永远都无法检索/删除密钥
哈希表存储桶中的循环循环导致无限循环
物品遗失(如果未在其他地方使用,则会被垃圾收集)
同一键的项目出现两次(迭代时)
链接错误的项目
(新)迭代器可能会意外拒绝
如果地图是NavigableMap,则可能会遇到额外的推倒


像段错误之类的硬错误在Java中不会发生,因为它是一种“安全”语言,在类似情况下会抛出NullPointerException

09-30 14:29
查看更多