From c5611847a3a5a3cbbf3593532318c3027098f518 Mon Sep 17 00:00:00 2001 From: qwwdfsad Date: Sat, 5 Mar 2016 00:28:25 +0300 Subject: [PATCH] Gson synchronized map replaced with concurrent hash map --- gson/src/main/java/com/google/gson/Gson.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/gson/src/main/java/com/google/gson/Gson.java b/gson/src/main/java/com/google/gson/Gson.java index 106d2485..c0fe235e 100644 --- a/gson/src/main/java/com/google/gson/Gson.java +++ b/gson/src/main/java/com/google/gson/Gson.java @@ -30,6 +30,7 @@ import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.atomic.AtomicLong; import java.util.concurrent.atomic.AtomicLongArray; @@ -108,6 +109,7 @@ public final class Gson { static final boolean DEFAULT_COMPLEX_MAP_KEYS = false; static final boolean DEFAULT_SPECIALIZE_FLOAT_VALUES = false; + private static final TypeToken NULL_KEY_SURROGATE = new TypeToken() {}; private static final String JSON_NON_EXECUTABLE_PREFIX = ")]}'\n"; /** @@ -120,8 +122,7 @@ public final class Gson { private final ThreadLocal, FutureTypeAdapter>> calls = new ThreadLocal, FutureTypeAdapter>>(); - private final Map, TypeAdapter> typeTokenCache - = Collections.synchronizedMap(new HashMap, TypeAdapter>()); + private final Map, TypeAdapter> typeTokenCache = new ConcurrentHashMap, TypeAdapter>(); private final List factories; private final ConstructorConstructor constructorConstructor; @@ -389,6 +390,9 @@ public final class Gson { */ @SuppressWarnings("unchecked") public TypeAdapter getAdapter(TypeToken type) { + if (type == null) { + type = (TypeToken) NULL_KEY_SURROGATE; + } TypeAdapter cached = typeTokenCache.get(type); if (cached != null) { return (TypeAdapter) cached;