diff --git a/platform/util/src/com/intellij/util/containers/ConcurrentFactoryMap.java b/platform/util/src/com/intellij/util/containers/ConcurrentFactoryMap.java index 84cf70b128e1..d0b2622d58be 100644 --- a/platform/util/src/com/intellij/util/containers/ConcurrentFactoryMap.java +++ b/platform/util/src/com/intellij/util/containers/ConcurrentFactoryMap.java @@ -15,14 +15,36 @@ */ package com.intellij.util.containers; +import com.intellij.openapi.util.SystemInfo; + import java.util.Map; /** * @author peter */ public abstract class ConcurrentFactoryMap extends FactoryMap { + + private interface MapFactory { + int DEFAULT_CONCURRENCY_LEVEL = Runtime.getRuntime().availableProcessors(); + + MapFactory V8_MAP_FACTORY = new MapFactory() { + public Map createMap() { + return new ConcurrentHashMap(); + } + }; + MapFactory DEFAULT_MAP_FACTORY = new MapFactory() { + public Map createMap() { + return new java.util.concurrent.ConcurrentHashMap(16, 0.75f, DEFAULT_CONCURRENCY_LEVEL); + } + }; + + Map createMap(); + } + + private static final MapFactory ourMapFactory = SystemInfo.isOracleJvm || SystemInfo.isAppleJvm? MapFactory.V8_MAP_FACTORY : MapFactory.DEFAULT_MAP_FACTORY; + @Override protected Map createMap() { - return new ConcurrentHashMap(); + return ourMapFactory.createMap(); } }