Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 更新两个并发哈希映射以保持自动性_Java_Scala - Fatal编程技术网

Java 更新两个并发哈希映射以保持自动性

Java 更新两个并发哈希映射以保持自动性,java,scala,Java,Scala,显然,在下面的代码中,更新两个映射不是原子的。有没有想过如何在没有大规模同步的情况下实现这一点 刚刚添加了更多细节:getFirstName()是一个从map2返回值的方法,因此如果method1包含同步,那么getFirstName也应该在同一个锁上同步。要获得哪个锁才能使它完全原子化?map1还是map2锁 object MyApp{ private val map1 = (new ConcurrentHashMap[String, String]).asScala privat

显然,在下面的代码中,更新两个映射不是原子的。有没有想过如何在没有大规模同步的情况下实现这一点

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

确保原子性是您要寻找的酸性属性。如果您担心另一个线程在填充第二个映射之前读取第一个映射,那么您需要锁定第一个映射,直到填充第二个映射。我不认为concurrentmaps在阅读方面提供了很多保证


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

您可以同步整个操作,同步各个步骤,或者发明某种可以容忍不一致性的“软”方案。@HotLicks:只是添加了更多细节。还有另一个方法,它从map2返回一个值。应该使用哪些锁?map1还是map2?在method1和getFirstName()方法中?您只需要在访问集合的所有方法中锁定完全相同的对象(以一种同步非常重要的方式)。可能是map1,map2,或者别的什么。有人强烈主张使用特定的单音锁对象,但我不相信这一点。