From 8d9ca3c3c7618c9922ca0306c3e549a909d18bc5 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 | 11 ++++++++--- 1 file changed, 8 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 39d3e22deb..ccb8811391 100644 --- a/common/src/main/java/io/netty/util/internal/ThreadLocalRandom.java +++ b/common/src/main/java/io/netty/util/internal/ThreadLocalRandom.java @@ -77,8 +77,13 @@ public final class ThreadLocalRandom extends Random { long initialSeedUniquifier = ThreadLocalRandom.initialSeedUniquifier; if (initialSeedUniquifier == 0) { // Use the system property value. - ThreadLocalRandom.initialSeedUniquifier = initialSeedUniquifier = - SystemPropertyUtil.getLong("io.netty.initialSeedUniquifier", 0); + ThreadLocalRandom.initialSeedUniquifier = initialSeedUniquifier = AccessController.doPrivileged( + new PrivilegedAction() { + @Override + public Long run() { + return Long.getLong("io.netty.initialSeedUniquifier", 0); + } + }); } // Otherwise, generate one. @@ -86,7 +91,7 @@ public final class ThreadLocalRandom extends Random { boolean secureRandom = AccessController.doPrivileged(new PrivilegedAction() { @Override public Boolean run() { - return SystemPropertyUtil.getBoolean("java.util.secureRandomSeed", false); + return Boolean.getBoolean("java.util.secureRandomSeed"); } });