我有一个C ++背景,据我所知,对std::map
的并发写入访问会产生非常不愉快的后果,使用java.util.HashMap
的Java情况如何?
请注意,我想知道在明显的比赛状况之外是否还有不良的副作用。
据我了解,仅当您在从另一个线程修改它的同时循环访问ConcurrentAccessException
时,才会抛出java.util.HashMap
,这是否意味着在另一个线程正在调用get
的情况下简单地调用put
方法是安全的cc>(“安全”是指可能发生的最糟糕的事情是您检索了错误的值)?
是否可能以类似方式导致SEGFAULT?
请注意,“相似”是指仅涉及纯Java方法/对象的竞争条件(没有JNI内容)
最佳答案
首先,永远不要那样做,将地图包装在Collections.synchronizedMap
中就很容易了。
内部状态可能会损坏,这可能导致以下任何情况:
[编辑]两个新项目(前两个)
内存泄漏,因为密钥进入错误的存储桶,并且除非执行clear()
,否则永远都无法检索/删除密钥
哈希表存储桶中的循环循环导致无限循环
物品遗失(如果未在其他地方使用,则会被垃圾收集)
同一键的项目出现两次(迭代时)
链接错误的项目
(新)迭代器可能会意外拒绝
如果地图是NavigableMap
,则可能会遇到额外的推倒
像段错误之类的硬错误在Java中不会发生,因为它是一种“安全”语言,在类似情况下会抛出NullPointerException
。