MapUtils工具类

针对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 代码。

 

posted @ 2023-11-28 22:08  使用D  阅读(19)  评论(0编辑  收藏  举报