diff --git a/gson/src/main/java/com/google/gson/internal/bind/TreeTypeAdapter.java b/gson/src/main/java/com/google/gson/internal/bind/TreeTypeAdapter.java index a5c6c5dcda..03dfc32631 100644 --- a/gson/src/main/java/com/google/gson/internal/bind/TreeTypeAdapter.java +++ b/gson/src/main/java/com/google/gson/internal/bind/TreeTypeAdapter.java @@ -47,7 +47,7 @@ public final class TreeTypeAdapter extends TypeAdapter { private final GsonContextImpl context = new GsonContextImpl(); /** The delegate is lazily created because it may not be needed, and creating it may fail. */ - private TypeAdapter delegate; + private volatile TypeAdapter delegate; public TreeTypeAdapter(JsonSerializer serializer, JsonDeserializer deserializer, Gson gson, TypeToken typeToken, TypeAdapterFactory skipPast) { @@ -83,6 +83,7 @@ public TreeTypeAdapter(JsonSerializer serializer, JsonDeserializer deseria } private TypeAdapter delegate() { + // A race might lead to `delegate` being assigned by multiple threads but the last assignment will stick TypeAdapter d = delegate; return d != null ? d