java - ConcurrentSkipListMap.compute() 对于相对更新是否安全?
问题描述
ConcurrentSkipListMap.compute(K, BiFunction)的 Javadoc指出:
尝试计算指定键及其当前映射值的映射(如果没有当前映射,则为 null)。该函数不能保证以原子方式应用一次。
我知道该函数可能会被多次调用,但是“一次原子”指的是什么?
X = X + 1
具体来说,在不多次增加映射值的情况下调用函数是否安全?
解决方案
它是说:
- 该函数可以被多次调用,并且
- 这些电话可能会在时间上重叠;即如果多个线程同时调用
compute
。
换句话说,不要期望函数引用被调用的方式是原子行为compute
。
具体来说,函数调用 X = X + 1 且地图值不会多次递增是否安全?
这取决于“调用 X = X + 1”的含义。(你没有包括一个明确的例子......)
如果这
x = x + 1
意味着您只是想增加地图的价值,那么:由于 in中的定义,一次调用
compute
只会导致一次“增量” 。compute
ConcurrentMap
但是,当您从
compute
该值返回时,可能已经增加了不止一次,因为另一个线程同时在做同样的事情。
如果
x = x + 1
引用了方法引用的副作用,那么所有的赌注都没有了:- 它可能已经发生过多次。
- 如果您的方法引用未正确同步,等等,可能会产生各种令人讨厌的影响。该规范暗示该
compute
调用不会在外部同步或调用互斥锁或类似的方法引用。正常的并发/内存规则适用......
推荐阅读
- swift - 条件绑定的初始化程序必须具有可选类型,而不是“字符串”?
- dart - Flutter 错误 - 内核二进制格式版本无效(找到 4,预期 6)
- html - 仅使用 CSS3 的视差效果
- sql - 从 Postgres 中的 Json 数组对象中获取值
- build - Autoconf 找不到 config.status
- ios - 将嵌套模型类对象作为 JSON api 参数传递
- keras - 当损失函数是自定义函数时,在 epoch 上绘制 MSE
- python - Python 请求 - 后续 Cookie 使用
- python - 如何使用正则表达式将字符串中的数字格式化为 2.5k 到 2.5e3
- javascript - 如何将对象保留在 html5 画布内?