java - 如何在 ConcurrentHashMap 中添加新成员> 没有同步或锁定
问题描述
解决方案
这些computeXXX
方法是线程安全的(并且是原子的!),并且可以防止彼此搞砸。它不是完全无锁的,但比手动同步要好得多。
public void record(String key, String value) {
entries.compute(key, (k, v) -> {
List<String> vals = v;
if(vals == null)
vals = new ArrayList<>();
vals.add(value);
return vals;
});
}
我将列表设为常规ArrayList
,因为在上面的代码中compute
应该保证可见性。如果其他代码依赖于它们synchronizedLists
,请相应地更改(或重写其他代码)。
示例删除方法:
public void delete(String key, String value) {
entries.compute(key, (k, v) -> {
List<String> vals = v;
if(vals == null)
return null; // No mapping, return null to keep the status quo
vals.remove(value); // Or whatever you intend to do
return vals.isEmpty() ? null : vals;
});
}
推荐阅读
- php - 来自控制器的成功重定向 URL 的 Ajax
- python - 如何在我的 Discord 机器人中实现热键?
- javascript - 当我在服务器中部署时,Angular Service Worker 离线缓存不起作用
- autohotkey - 使用 AutoHotKey 从邮箱中提取附件
- github - 如何将我的 GitHub 项目设置为公开但除了我之外没有人可以更改和推送它?
- javascript - 如何将数组键设置为 javascript/node js 中的索引
- javascript - 如何在 mvc 的 jquery 中使用 @ 符号
- python - 如何从 tkinter 组合框返回值
- java - 如何从 RecyclerView 项目(Firebase url)直接下载?不能让它工作
- mysql - 使用 GRANT 分配 CREATE USER、CREATE ROLE、SHOW DB 和动态权限等权限