From a99bd41d635e8d2a48220bd0839203a79df6e69d Mon Sep 17 00:00:00 2001 From: "Gregory.Shrago" Date: Wed, 7 Jun 2017 20:55:35 +0300 Subject: [PATCH] treat concurrent maps with cacheOrGet --- .../src/com/intellij/util/containers/FactoryMap.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/platform/util/src/com/intellij/util/containers/FactoryMap.java b/platform/util/src/com/intellij/util/containers/FactoryMap.java index 8f472a6d6db2..f7a8f09d0fde 100644 --- a/platform/util/src/com/intellij/util/containers/FactoryMap.java +++ b/platform/util/src/com/intellij/util/containers/FactoryMap.java @@ -17,6 +17,7 @@ package com.intellij.util.containers; import com.intellij.openapi.util.RecursionGuard; import com.intellij.openapi.util.RecursionManager; +import com.intellij.util.ConcurrencyUtil; import com.intellij.util.Function; import com.intellij.util.ObjectUtils; import gnu.trove.THashMap; @@ -24,6 +25,7 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.*; +import java.util.concurrent.ConcurrentMap; /** * @author peter @@ -57,7 +59,12 @@ public abstract class FactoryMap implements Map { value = create((K)key); if (stamp.mayCacheNow()) { V v = notNull(value); - map.put(k, v); + if (map instanceof ConcurrentMap) { + value = ConcurrencyUtil.cacheOrGet((ConcurrentMap)map, k, v); + } + else { + map.put(k, v); + } } } return value == FAKE_NULL() ? null : value;