[#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.
This commit is contained in:
Norman Maurer 2016-08-19 14:15:19 +02:00
parent b5bd2ea66d
commit 8d9ca3c3c7

View File

@ -77,8 +77,13 @@ public final class ThreadLocalRandom extends Random {
long initialSeedUniquifier = ThreadLocalRandom.initialSeedUniquifier; long initialSeedUniquifier = ThreadLocalRandom.initialSeedUniquifier;
if (initialSeedUniquifier == 0) { if (initialSeedUniquifier == 0) {
// Use the system property value. // Use the system property value.
ThreadLocalRandom.initialSeedUniquifier = initialSeedUniquifier = ThreadLocalRandom.initialSeedUniquifier = initialSeedUniquifier = AccessController.doPrivileged(
SystemPropertyUtil.getLong("io.netty.initialSeedUniquifier", 0); new PrivilegedAction<Long>() {
@Override
public Long run() {
return Long.getLong("io.netty.initialSeedUniquifier", 0);
}
});
} }
// Otherwise, generate one. // Otherwise, generate one.
@ -86,7 +91,7 @@ public final class ThreadLocalRandom extends Random {
boolean secureRandom = AccessController.doPrivileged(new PrivilegedAction<Boolean>() { boolean secureRandom = AccessController.doPrivileged(new PrivilegedAction<Boolean>() {
@Override @Override
public Boolean run() { public Boolean run() {
return SystemPropertyUtil.getBoolean("java.util.secureRandomSeed", false); return Boolean.getBoolean("java.util.secureRandomSeed");
} }
}); });