From 218229887d944c80f71cc7529d43a6d67f13a18f Mon Sep 17 00:00:00 2001 From: Babneet Singh Date: Thu, 6 Feb 2025 09:55:14 -0500 Subject: [PATCH] Use a nested holder class to store allPermissionsPD Using this approach, allPermissionsPD can be a final field. VM's class initialization mechanisms will prevent races via the static block. Fixes: #20351 Signed-off-by: Babneet Singh --- .../share/classes/java/lang/Class.java | 25 ++++++------------- 1 file changed, 8 insertions(+), 17 deletions(-) diff --git a/jcl/src/java.base/share/classes/java/lang/Class.java b/jcl/src/java.base/share/classes/java/lang/Class.java index 8bfcd6a9c4f..44182131850 100644 --- a/jcl/src/java.base/share/classes/java/lang/Class.java +++ b/jcl/src/java.base/share/classes/java/lang/Class.java @@ -165,8 +165,6 @@ public final class Class implements java.io.Serializable, GenericDeclaration, private static final int ENUM = 0x4000; private static final int MEMBER_INVALID_TYPE = -1; - private static volatile ProtectionDomain allPermissionsPD; - /*[IF]*/ /** * It is important that these remain static final @@ -2485,23 +2483,16 @@ ProtectionDomain getProtectionDomainInternal() { if (result != null) { return result; } - if (allPermissionsPD == null) { - allocateAllPermissionsPD(); - } - return allPermissionsPD; + return AllPermissionsPDHolder.allPermissionsPD; } -private void allocateAllPermissionsPD() { - /* Synchronization to ensure safe initialization and safe publication of - * allPermissionsPD. This addresses the locking contention on allPermissionsPD - * in getProtectionDomain(). - */ - synchronized(this) { - if (allPermissionsPD == null) { - Permissions collection = new Permissions(); - collection.add(SecurityConstants.ALL_PERMISSION); - allPermissionsPD = new ProtectionDomain(null, collection); - } +private static final class AllPermissionsPDHolder { + static final ProtectionDomain allPermissionsPD; + private AllPermissionsPDHolder() {} + static { + Permissions collection = new Permissions(); + collection.add(SecurityConstants.ALL_PERMISSION); + allPermissionsPD = new ProtectionDomain(null, collection); } }