是否有替换while循环用于使用scala TrieMap更新concurrentMap

时间:2014-01-22 15:18:26

标签: java scala concurrency

在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}中是否存在一次性操作这对我来说会循环,如果是的话,请你举个例子吗?

1 个答案:

答案 0 :(得分:5)

小心TrieMap(至少是可变的),它实际上并不是线程安全的。它至少继承了getOrElseUpdate的非线程安全实现。我没有检查其他方法(例如putIfAbsent)是否有相同的问题,但是一个并发错误已经够糟了!

<强>附录

我不会再添加其他评论,而是将新信息放在这里......

TrieMap.putIfAbsent具有TrieMap特定的实现,但其值参数不是一个名字参数,所以如果目的是缓存是为了避免昂贵的计算,它再次失败!