public static void main(String[] args) {
Map<String, Integer> map = new ConcurrentHashMap<>(16);
map.computeIfAbsent("AaAa", key -> {
return map.computeIfAbsent("BBBB", key2 -> 42);
});
System.out.println(map.size());
}
在 JDK1.8中,这段代码执行会发生 死循环 。注意:使用
ConcurrentHashMap的 computeIfAbsent()方法,不要在 lamda表达式中再次去更新此map。实际项目中 我们经常会使用json的反序列化。
反序列的时候 有可能在 set**()方法中写一些业务代码。(强烈建议:最好不要在字段的set/get方法中写业务代码)
伪代码:
// 从数据库中获取数据,放入缓存系统中,如:caffeine 中的LocalLoadingCache 方法。
@Override
default V get(K key) {
return cache().computeIfAbsent(key, mappingFunction());
}
获取的时候,如果获取不到就会走 mappingFunction() 方法。重新放入 map 中.
此时反序列json串,进入set方法。
public void setProcess(String process){
// 写一些业务代码
// 获取数据,数据又再一次重新 走 computeIfAbsent()方法。
}
这时候就很可能会死循环了。
这种情况,开发的时候不注意那就很容易出错了。