ConcurrentSkipListMap.compute(K, BiFunction)的Javadoc声明:
尝试计算指定键及其当前映射值的映射(如果没有当前映射,则为null)。该功能不能保证原子地应用一次。
我知道该函数可能会多次调用,但是“原子一次”指的是什么?
具体来说,函数调用X = X + 1
且映射值不会多次递增是安全的吗?
答案 0 :(得分:2)
是说:
compute
。
换句话说,不要期望compute
调用函数引用的方式出现atomic行为。
具体来说,函数调用X = X + 1而不使映射值多次递增是否安全?
这取决于“调用X = X + 1”的含义。 (您没有提供清晰的示例...。)
如果x = x + 1
表示您只是想增加地图的值,则:
由于compute
中compute
中的定义,对ConcurrentMap
的一次调用只会导致一个“增量”。
但是当您从compute
返回时,该值可能会增加一次以上,因为另一个线程正在同时执行相同的操作。
如果x = x + 1
引用了方法引用的副作用,则所有投注均关闭:
compute
调用不会在外部进行同步,也不会在互斥体或类似的对象中调用方法引用。正常的并发/内存规则适用...