更新 ConcurrentHashMap 中其他键的后果#computeIfAbsent

2024-01-31

Javadoc 来自ConcurrentHashMap#computeIfAbsent says

计算应该简短且简单,并且不得试图 更新此地图的任何其他映射。

但是,据我所知,使用remove() and clear()里面的方法mappingFunction工作正常。例如这个

Key element = elements.computeIfAbsent(key, e -> {
    if (usages.size() == maxSize) {
        elements.remove(oldest);
    }
    return loader.load(key);
});

里面使用remove()方法有什么不好的后果mappingFunction可能?


这是一个不良后果的例子:

ConcurrentHashMap<Integer,String> cmap = new ConcurrentHashMap<> ();
cmap.computeIfAbsent (1, e-> {cmap.remove (1); return "x";});

此代码会导致死锁。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

更新 ConcurrentHashMap 中其他键的后果#computeIfAbsent 的相关文章

随机推荐