java - ConcurrentHashMap 的 compute、computeIfAbsent 和 computeIfPresent 方法是完全原子的吗?
问题描述
整个方法调用是原子的还是只是 BiFunction 执行原子的?它是阻止所有键还是仅阻止同一键上的调用?
解决方案
以下详细信息适用于 OpenJDK Java 11。
Node
这三个方法在调用方法并更新键/值时对映射中的a 进行锁定。该节点通常是散列桶的节点链或节点树中的第一个节点。在同一个桶中插入、更新或删除键/值对的并发尝试将被阻止,直到锁被释放。
(其他版本的 Java 的行为可能会有所不同。)
整个方法调用是原子的还是只是 BiFunction 执行原子的?
整个方法调用。
它是阻止所有键还是仅阻止同一键上的调用?
中间某个地方; 看上面。但是,如果您遵循javadocs中的此建议,则无关紧要。
“在计算过程中,其他线程在此映射上的一些尝试更新操作可能会被阻止,因此计算应该简短而简单......”
推荐阅读
- c# - 拥有用于开发和生产的连接字符串
- python - 当 python pandas.read_csv 在 azure 上时,编码没有改变
- python - 在 dict 中仅打印 i 的键
- r - R中的错误与knn的混淆矩阵
- java - 填表后空数据表thymeleaf和spring-boot
- sql - 在第一个表中创建记录时在另一个表中创建记录
- visual-studio-code - gitpods openvscode-server 的命令行选项是什么?
- sql - 使用聚合函数时获取 NULL 值
- python-3.x - 在 Django 3.2 中,如何使用数组中的值初始化构造函数中的 ManyToMany 字段?
- laravel - Laravel 8:尝试在 null 上读取属性“id”