更新两个并发的hashmaps维护原子性

时间:2014-03-14 12:00:51

标签: java scala

明确更新两张地图在下面的代码中不是原子的。如何在没有大尺寸同步的情况下实现这一目标的任何想法?

刚刚添加了更多细节: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)
   }
 }

1 个答案:

答案 0 :(得分:1)

确保原子性是您正在寻找的ACID属性。如果您在填充第二个地图之前担心第一个地图上的另一个读取线程,那么您将需要锁定第一个地图,直到填充第二个地图。我不认为concurrentmaps会对读取提供很多保证。

一个选项可能是使用相同类型的底层锁创建自己的ConcurrentMap实现(仅在写入时锁定部分哈希表),但是锁定两个底层哈希表的相应部分,直到写操作完成。 / p>