如何对Scala`TrieMap`的“MapEntry”进行“同步”?

时间:2016-09-10 00:30:14

标签: multithreading scala

如果新值vold某个谓词TrieMap,我想为某个键t更新k vnew的值p(vold, vnew)true。由于可以通过多个线程修改值,因此需要synchronized块。代码可以t.synchronized,但这会阻止更新其他键的值。是否可以仅阻止实际更新的密钥?

现在我已经写出了问题,t.keySet.filter(_ == k).head.synchronized是否有意义(因为不能保证kt中的密钥的实例相同)?是否有更规范的方法来做到这一点?

2 个答案:

答案 0 :(得分:1)

  

由于可以通过多个线程修改值,因此需要同步块。

使用TrieMap的规范方法是使用replace / putIfAbsent / remove方法。获取旧值,计算新值,如果replace失败,请重复。

通过API查看,我看不到任何适合您想要的内容,t.keySet.filter(_ == k)必须遍历整个Map;在大多数情况下,我认为它比仅仅锁定它更糟糕(除非你有比条目更多的线程?)。

答案 1 :(得分:0)

如果p满足以下条件:

  • 反对称(即p(v0, v1)暗示!p(v1, v0)!p(v0, v1)暗示p(v1, v0)
  • 传递性(即p(v0, v1)p(v1, v2)隐含p(v0, v1)

可以实现以下内容(警告:以下代码未经测试):

def replaceIf(key: K, newvalue: V)(predicate: (V, V) => Boolean): Option[V] = {
  val oldvalue = replace(key, newvalue)

  if (oldvalue == None || predicate(newvalue, oldvalue.get)) {
    oldvalue
  } else {
    replaceIf(key, oldvalue.get)(predicate)
  }
}