ConcurrentSkipListMap.comute()对相对更新安全吗



ConcurrentSkipListMap.compute(K,BiFunction(的Javadoc状态:

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

我知道函数可能会被多次调用,但"原子地调用一次"指的是什么?

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

据说:

  • 函数可以被调用多次,并且
  • 这些通话可能在时间上重叠;即如果多个线程同时调用CCD_ 2

换句话说,不要像compute调用函数引用那样期望原子行为。


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

这取决于"invoke X=X+1"的含义。(你没有包括一个明确的例子……(

  • 如果x = x + 1表示您只是在尝试增加映射的值,那么:

    • 由于ConcurrentMapcompute中的定义,对compute的一次调用只会导致一次"增量"。

    • 但是,当您从compute返回时,该值可能会增加不止一次,因为另一个线程同时在做同样的事情。

  • 如果x = x + 1引用了方法引用的副作用,则所有赌注都将失效:

    • 这种情况可能发生过多次
    • 如果你的方法引用没有正确同步,等等,可能会有各种恶劣的影响。该规范意味着compute调用不会进行外部同步,也不会调用互斥对象中的方法引用或类似的东西。应用正常并发/内存规则

相关内容

  • 没有找到相关文章

最新更新