> 没有同步或锁定,java"/>

首页 > 解决方案 > 如何在 ConcurrentHashMap 中添加新成员> 没有同步或锁定

问题描述

标签: java

解决方案


这些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;
    });
}

推荐阅读