From 1594ac1a2ee761a342109d2c1b2b660c4085d6b0 Mon Sep 17 00:00:00 2001 From: Jerry Berg <107155935+googleberg@users.noreply.github.com> Date: Wed, 12 Oct 2022 14:00:18 -0600 Subject: [PATCH] Merge pull request #10770 from protocolbuffers/googleberg-cl-480629524 Mark default instance as immutable first to avoid race during static initialization of default instances. --- .../java/com/google/protobuf/GeneratedMessageLite.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/java/core/src/main/java/com/google/protobuf/GeneratedMessageLite.java b/java/core/src/main/java/com/google/protobuf/GeneratedMessageLite.java index d4151f4490..1ef2143503 100644 --- a/java/core/src/main/java/com/google/protobuf/GeneratedMessageLite.java +++ b/java/core/src/main/java/com/google/protobuf/GeneratedMessageLite.java @@ -407,8 +407,13 @@ public abstract class GeneratedMessageLite< protected static > void registerDefaultInstance( Class clazz, T defaultInstance) { + // Default instances must be immutable. + // Marking immutable here to avoid extra bytecode in every generated message class. + // Only calling "markImmutable" rather than "makeImmutable" because for Default Instances: + // 1. All sub-messages are initialized to null / default instances and thus immutable + // 2. All lists are initialized to default instance empty lists which are also immutable. + defaultInstance.markImmutable(); defaultInstanceMap.put(clazz, defaultInstance); - defaultInstance.makeImmutable(); } protected static Object newMessageInfo(