diff --git a/gson/src/main/java/com/google/gson/Gson.java b/gson/src/main/java/com/google/gson/Gson.java index 106d2485..a335d870 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,7 +390,7 @@ public final class Gson { */ @SuppressWarnings("unchecked") public TypeAdapter getAdapter(TypeToken type) { - TypeAdapter cached = typeTokenCache.get(type); + TypeAdapter cached = typeTokenCache.get(type == null ? NULL_KEY_SURROGATE : type); if (cached != null) { return (TypeAdapter) cached; }