From c5611847a3a5a3cbbf3593532318c3027098f518 Mon Sep 17 00:00:00 2001 From: qwwdfsad Date: Sat, 5 Mar 2016 00:28:25 +0300 Subject: [PATCH 1/2] 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; From 31dcfa3ad6fff0ee64f0fc5b8a1712c3ef3dcf95 Mon Sep 17 00:00:00 2001 From: qwwdfsad Date: Sat, 5 Mar 2016 02:08:26 +0300 Subject: [PATCH 2/2] More appropriate usage of null key surrogate in Gson#getAdapter for backward compatibility --- gson/src/main/java/com/google/gson/Gson.java | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/gson/src/main/java/com/google/gson/Gson.java b/gson/src/main/java/com/google/gson/Gson.java index c0fe235e..a335d870 100644 --- a/gson/src/main/java/com/google/gson/Gson.java +++ b/gson/src/main/java/com/google/gson/Gson.java @@ -390,10 +390,7 @@ public final class Gson { */ @SuppressWarnings("unchecked") public TypeAdapter getAdapter(TypeToken type) { - if (type == null) { - type = (TypeToken) NULL_KEY_SURROGATE; - } - TypeAdapter cached = typeTokenCache.get(type); + TypeAdapter cached = typeTokenCache.get(type == null ? NULL_KEY_SURROGATE : type); if (cached != null) { return (TypeAdapter) cached; }