针对mybatis3下的org.apache.ibatis.uitl下的MapUtils说明:
代码如下:
public class MapUtil { /** * A temporary workaround for Java 8 specific performance issue JDK-8161372 .<br> * This class should be removed once we drop Java 8 support. * * @see <a href= * "https://bugs.openjdk.java.net/browse/JDK-8161372">https://bugs.openjdk.java.net/browse/JDK-8161372</a> */ public static <K, V> V computeIfAbsent(Map<K, V> map, K key, Function<K, V> mappingFunction) { V value = map.get(key); if (value != null) { return value; } return map.computeIfAbsent(key, mappingFunction); } /** * Map.entry(key, value) alternative for Java 8. */ public static <K, V> Entry<K, V> entry(K key, V value) { return new AbstractMap.SimpleImmutableEntry<>(key, value); } private MapUtil() { } }
重点说明其中提到的解决bug问题:https://bugs.openjdk.java.net/browse/JDK-816137
实际上是使用ConcurrentHashMap的computeIfAbsent方法时,会有性能问题,特别是同一个key同时进行computeIfAbsent时,所以前置使用了map.get方法进行获取属性,可以提升性能:直接调用 computeIfAbsent
的性能是每秒百万级,先调用 get
做检查的性能是每秒十亿级。
为什么性能会差异这么多那?
在jdk8下,ConcurrentHashMap即使 key 存在,computeIfAbsent
去找 key 的时候,都会进入 synchronized
代码。
标签:map,return,get,MapUtils,value,computeIfAbsent,key,工具 From: https://www.cnblogs.com/use-D/p/17853408.html