在java中我习惯做以下事情:
boolean done = false;
while(!done) {
Long oldValue = map.putIfAbsent(key, 1L);
if(oldValue != null) {
done = map.replace(key, oldValue, oldValue + 1);
} else {
done = true;
}
}
现在我看到在scala中我最好使用TrieMap
(如果我坚持使用可变版本)我真的不明白这个{{1}中是否存在一次性操作这对我来说会循环,如果是的话,请你举个例子吗?
答案 0 :(得分:5)
小心TrieMap
(至少是可变的),它实际上并不是线程安全的。它至少继承了getOrElseUpdate
的非线程安全实现。我没有检查其他方法(例如putIfAbsent
)是否有相同的问题,但是一个并发错误已经够糟了!
<强>附录强>
我不会再添加其他评论,而是将新信息放在这里......
TrieMap.putIfAbsent
具有TrieMap
特定的实现,但其值参数不是一个名字参数,所以如果目的是缓存是为了避免昂贵的计算,它再次失败!