如果新值vold
某个谓词TrieMap
,我想为某个键t
更新k
vnew
的值p(vold, vnew)
是true
。由于可以通过多个线程修改值,因此需要synchronized
块。代码可以t.synchronized
,但这会阻止更新其他键的值。是否可以仅阻止实际更新的密钥?
现在我已经写出了问题,t.keySet.filter(_ == k).head.synchronized
是否有意义(因为不能保证k
与t
中的密钥的实例相同)?是否有更规范的方法来做到这一点?
答案 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)
}
}