ConcurrentSkipListMap.compute()对于相对更新安全吗?

时间:2018-11-15 00:51:33

标签: java java.util.concurrent concurrentskiplistmap

ConcurrentSkipListMap.compute(K, BiFunction)的Javadoc声明:

  

尝试计算指定键及其当前映射值的映射(如果没有当前映射,则为null)。该功能不能保证原子地应用一次。

我知道该函数可能会多次调用,但是“原子一次”指的是什么?

具体来说,函数调用X = X + 1且映射值不会多次递增是安全的吗?

1 个答案:

答案 0 :(得分:2)

是说:

  • 该函数可以被多次调用,并且
  • 这些通话可能会在时间上重叠;也就是说,如果多个线程正在同时调用compute

换句话说,不要期望compute调用函数引用的方式出现atomic行为。


  

具体来说,函数调用X = X + 1而不使映射值多次递增是否安全?

这取决于“调用X = X + 1”的含义。 (您没有提供清晰的示例...。)

  • 如果x = x + 1表示您只是想增加地图的值,则:

    • 由于computecompute中的定义,对ConcurrentMap的一次调用只会导致一个“增量”。

    • 但是当您从compute返回时,该值可能会增加一次以上,因为另一个线程正在同时执行相同的操作。

  • 如果x = x + 1引用了方法引用的副作用,则所有投注均关闭:

    • 它可能已经发生了多次。
    • 如果您的方法引用未正确同步等,则可能存在各种令人讨厌的效果。该规范意味着compute调用不会在外部进行同步,也不会在互斥体或类似的对象中调用方法引用。正常的并发/内存规则适用...