考虑以下两种情况:
在其中任何一种情况下,ConcurrentHashMap
是否为普通HashMap
以上的线程安全提供了额外的帮助?
答案 0 :(得分:0)
在第一种情况下,它在实践中无关紧要,但不能保证写入常规散列映射的修改将被其他线程看到。因此,如果一个线程最初创建并填充了地图,并且该线程从未与其他线程同步,那么这些线程可能永远不会看到设置到地图中的初始值。
上述情况在实践中不太可能,并且只会发生单个同步事件或发生在线程之间的保证之前(例如读/写volatile变量),以确保理论上的正确性。
在第二种情况下,由于访问HashMap在结构上修改它(添加值)需要同步,因此存在一个问题。此外,您需要某种类型的同步来与其他线程建立发生在之前的关系/共享可见性,或者无法保证其他线程将看到您放入的新值.ConcurrentHashMap提供了这些保证,并且在一个时不会中断线程在结构上修改它。
答案 1 :(得分:0)
线程安全没有区别,没有。对于场景#2,性能存在差异,时序保证差异很小。
您的场景#2没有同步,因此想要使用缓存的线程不必排队等待其他人完成。但是,为了获得这种好处,您在同步边界处没有硬发生的关系,因此两个线程可能会同时或多或少地计算相同的缓存值。只要计算是可重复的,这通常是无害的。
(ConcurrentHashMap不允许将null
用作密钥,这也略有不同。)