From e4154bcb0b91acfe5cf041208fc255aff16143be Mon Sep 17 00:00:00 2001 From: Norman Maurer Date: Fri, 19 Aug 2016 14:15:19 +0200 Subject: [PATCH] [#5720] Static initializers can cause deadlock Motivation: SystemPropertyUtil requires InternalLoggerFactory requires ThreadLocalRandom requires SystemPropertyUtil. This can lead to a dead-lock. Modifications: Ensure ThreadLocalRandom does not require SystemPropertyUtil during initialization. Result: No more deadlock possible. --- .../io/netty/util/internal/ThreadLocalRandom.java | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/common/src/main/java/io/netty/util/internal/ThreadLocalRandom.java b/common/src/main/java/io/netty/util/internal/ThreadLocalRandom.java index fb1594bcae..f8c6a539d4 100644 --- a/common/src/main/java/io/netty/util/internal/ThreadLocalRandom.java +++ b/common/src/main/java/io/netty/util/internal/ThreadLocalRandom.java @@ -66,8 +66,7 @@ public final class ThreadLocalRandom extends Random { private static final AtomicLong seedUniquifier = new AtomicLong(); - private static volatile long initialSeedUniquifier = - SystemPropertyUtil.getLong("io.netty.initialSeedUniquifier", 0); + private static volatile long initialSeedUniquifier; private static final Thread seedGeneratorThread; private static final BlockingQueue seedQueue; @@ -75,11 +74,18 @@ public final class ThreadLocalRandom extends Random { private static volatile long seedGeneratorEndTime; static { + initialSeedUniquifier = AccessController.doPrivileged(new PrivilegedAction() { + @Override + public Long run() { + return Long.getLong("io.netty.initialSeedUniquifier", 0); + } + }); + if (initialSeedUniquifier == 0) { boolean secureRandom = AccessController.doPrivileged(new PrivilegedAction() { @Override public Boolean run() { - return SystemPropertyUtil.getBoolean("java.util.secureRandomSeed", false); + return Boolean.getBoolean("java.util.secureRandomSeed"); } });