我有C ++的背景知识,据我所知,对std::map
的并发写入访问会产生非常不愉快的后果,在Java中使用java.util.HashMap
的情况是什么?
请注意,我想知道在明显的比赛状况之外是否还有不良的副作用。
据我了解,ConcurrentAccessException
仅在您从另一个线程修改它的同时循环访问java.util.HashMap
时抛出,这意味着简单地调用{{1 }}方法,而另一个线程正在调用get
(“安全”是指可能发生的最糟糕的事情是您检索了错误的值)?
是否可能以类似方式导致SEGFAULT?
请注意,“相似”是指仅涉及纯Java方法/对象(没有JNI内容)的竞争条件
答案 0 :(得分:2)
首先,千万不要那样做,将地图包裹在Collections.synchronizedMap
中,这很容易。
内部状态可能会损坏,这可能导致以下任何情况:
[edit]两个新项目(前两个)
clear()
,否则密钥将永远无法被检索/删除NavigableMap
,则可能会受到额外的推倒在Java中不会发生诸如段错误之类的硬错误,因为它是一种“安全”语言,在类似情况下会抛出NullPointerException
。
答案 1 :(得分:2)
可能发生的最坏情况包括:
get
返回错误的值,put
丢失条目,或者我已经看到了所有报告。
原因是,如果在使用共享的HashMap
时线程未正确同步,则可能是:
是否可能以类似方式导致SEGFAULT?
不。至少,除非您的代码库包含本机代码或使用Unsafe
,否则它不会发送JVM错误。
答案 2 :(得分:0)
据我所知,这显然是不安全的,您甚至不应该考虑从不同的线程调用HashMap方法。同样在Java中,您可能不会面对SEGFAULT,就像在C和C ++中可以面对的那样。
相反,您应该考虑使用ConcurrentHashMap
。