明确更新两张地图在下面的代码中不是原子的。如何在没有大尺寸同步的情况下实现这一目标的任何想法?
刚刚添加了更多细节:getFirstName()是一个从map2返回值的方法,因此如果method1包含同步,则getFirstName也应该在同一个锁上同步。哪个锁定获取使这完全原子化? map1或map2锁定?
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)
}
}
答案 0 :(得分:1)
确保原子性是您正在寻找的ACID属性。如果您在填充第二个地图之前担心第一个地图上的另一个读取线程,那么您将需要锁定第一个地图,直到填充第二个地图。我不认为concurrentmaps会对读取提供很多保证。
一个选项可能是使用相同类型的底层锁创建自己的ConcurrentMap实现(仅在写入时锁定部分哈希表),但是锁定两个底层哈希表的相应部分,直到写操作完成。 / p>