ConcurrentSkipListMap.compute(K,BiFunction(的Javadoc状态:
尝试计算指定键及其当前映射值的映射(如果没有当前映射,则为null(。该函数不能保证以原子方式应用一次。
我知道函数可能会被多次调用,但"原子地调用一次"指的是什么?
具体来说,函数调用X = X + 1
而不使映射值多次递增是否安全?
据说:
- 函数可以被调用多次,并且
- 这些通话可能在时间上重叠;即如果多个线程同时调用CCD_ 2
换句话说,不要像compute
调用函数引用那样期望原子行为。
具体来说,函数调用X=X+1而不使映射值多次递增是否安全?
这取决于"invoke X=X+1"的含义。(你没有包括一个明确的例子……(
-
如果
x = x + 1
表示您只是在尝试增加映射的值,那么:-
由于
ConcurrentMap
中compute
中的定义,对compute
的一次调用只会导致一次"增量"。 -
但是,当您从
compute
返回时,该值可能会增加不止一次,因为另一个线程同时在做同样的事情。
-
-
如果
x = x + 1
引用了方法引用的副作用,则所有赌注都将失效:- 这种情况可能发生过多次
- 如果你的方法引用没有正确同步,等等,可能会有各种恶劣的影响。该规范意味着
compute
调用不会进行外部同步,也不会调用互斥对象中的方法引用或类似的东西。应用正常并发/内存规则