Skip to content

Commit 2182298

Browse files
committed
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: eclipse-openj9#20351 Signed-off-by: Babneet Singh <[email protected]>
1 parent 516d0f5 commit 2182298

File tree

1 file changed

+8
-17
lines changed
  • jcl/src/java.base/share/classes/java/lang

1 file changed

+8
-17
lines changed

Diff for: jcl/src/java.base/share/classes/java/lang/Class.java

+8-17
Original file line numberDiff line numberDiff line change
@@ -165,8 +165,6 @@ public final class Class<T> implements java.io.Serializable, GenericDeclaration,
165165
private static final int ENUM = 0x4000;
166166
private static final int MEMBER_INVALID_TYPE = -1;
167167

168-
private static volatile ProtectionDomain allPermissionsPD;
169-
170168
/*[IF]*/
171169
/**
172170
* It is important that these remain static final
@@ -2485,23 +2483,16 @@ ProtectionDomain getProtectionDomainInternal() {
24852483
if (result != null) {
24862484
return result;
24872485
}
2488-
if (allPermissionsPD == null) {
2489-
allocateAllPermissionsPD();
2490-
}
2491-
return allPermissionsPD;
2486+
return AllPermissionsPDHolder.allPermissionsPD;
24922487
}
24932488

2494-
private void allocateAllPermissionsPD() {
2495-
/* Synchronization to ensure safe initialization and safe publication of
2496-
* allPermissionsPD. This addresses the locking contention on allPermissionsPD
2497-
* in getProtectionDomain().
2498-
*/
2499-
synchronized(this) {
2500-
if (allPermissionsPD == null) {
2501-
Permissions collection = new Permissions();
2502-
collection.add(SecurityConstants.ALL_PERMISSION);
2503-
allPermissionsPD = new ProtectionDomain(null, collection);
2504-
}
2489+
private static final class AllPermissionsPDHolder {
2490+
static final ProtectionDomain allPermissionsPD;
2491+
private AllPermissionsPDHolder() {}
2492+
static {
2493+
Permissions collection = new Permissions();
2494+
collection.add(SecurityConstants.ALL_PERMISSION);
2495+
allPermissionsPD = new ProtectionDomain(null, collection);
25052496
}
25062497
}
25072498

0 commit comments

Comments
 (0)