Java 更新两个并发哈希映射以保持自动性
显然,在下面的代码中,更新两个映射不是原子的。有没有想过如何在没有大规模同步的情况下实现这一点 刚刚添加了更多细节:getFirstName()是一个从map2返回值的方法,因此如果method1包含同步,那么getFirstName也应该在同一个锁上同步。要获得哪个锁才能使它完全原子化?map1还是map2锁Java 更新两个并发哈希映射以保持自动性,java,scala,Java,Scala,显然,在下面的代码中,更新两个映射不是原子的。有没有想过如何在没有大规模同步的情况下实现这一点 刚刚添加了更多细节:getFirstName()是一个从map2返回值的方法,因此如果method1包含同步,那么getFirstName也应该在同一个锁上同步。要获得哪个锁才能使它完全原子化?map1还是map2锁 object MyApp{ private val map1 = (new ConcurrentHashMap[String, String]).asScala privat
object MyApp{
private val map1 = (new ConcurrentHashMap[String, String]).asScala
private val map2 = (new ConcurrentHashMap[String, String]).asScala
def method1(firstName:String,lastName:String) ={
.....
map1 += firstName -> lastName
map2 += lastName -> firstName
}
def getFirstName(string:lastName):Option[String] ={
map2.get(firstName)
}
}
确保原子性是您要寻找的酸性属性。如果您担心另一个线程在填充第二个映射之前读取第一个映射,那么您需要锁定第一个映射,直到填充第二个映射。我不认为concurrentmaps在阅读方面提供了很多保证
一个选项可能是使用相同类型的底层锁创建自己的ConcurrentMap实现(仅在写入时锁定哈希表的一部分),但在写入操作完成之前锁定两个底层哈希表的适当部分。您可以同步整个操作,同步各个步骤,或者发明某种可以容忍不一致性的“软”方案。@HotLicks:只是添加了更多细节。还有另一个方法,它从map2返回一个值。应该使用哪些锁?map1还是map2?在method1和getFirstName()方法中?您只需要在访问集合的所有方法中锁定完全相同的对象(以一种同步非常重要的方式)。可能是map1,map2,或者别的什么。有人强烈主张使用特定的单音锁对象,但我不相信这一点。