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

Jas*_*Jas 0 java concurrency scala

在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;
    }
}
Run Code Online (Sandbox Code Playgroud)

现在我看到scala中我最好使用TrieMap(如果我坚持使用可变版本)我真的不明白是否已经存在一个单击操作,这TrieMap将为我做循环,如果是的话可以你举个例子吗?

Ran*_*ulz 5

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

附录

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

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