Hi Jeremy, Thanks for reporting that. Actually I'm not quite sure that drainLoggerRefQueueBounded() needs to be synchronized on LogManager.
I'll need to study that - but my gut feeling is that we might be able to get rid of that lock (possibly). I'll have to study the call chain to see whether there are other potential issues down the road. I have logged https://bugs.openjdk.java.net/browse/JDK-8027670 best regards, -- daniel On 10/31/13 6:43 PM, Jeremy Manson wrote:
Hi folks, This is against a slightly older version of LogManager, but the problem still seems to be there at JDK8 head. It seems as if the previous fixes didn't go far enough? See stack traces below. Anyway, I don't see any open bugs about it, so I'm reporting it. Two obvious fixes suggest themselves to me: - Lock the LogManager when addLogger(Logger) calls cx.addLocalLogger(). This avoids the lock ordering problem, but adds potential contention overhead. - Don't call drainLoggerRefQueueBounded() if you are reentrantly calling addLogger(). You could do something as stupid as having a volatile boolean field "calledDrainRecently" that you set on entrance to addLogger and unset on exit (assuming you set it). The first is less sloppy, the second is less overhead. There are probably third and fourth and fifth options, too. Jeremy Thread 1: at java.util.logging.LogManager.drainLoggerRefQueueBounded(LogManager.java:816) - waiting to lock <0x1b260998> (a java.util.logging.LogManager) at java.util.logging.LogManager.addLogger(LogManager.java:852) at java.util.logging.LogManager.demandLogger(LogManager.java:398) at java.util.logging.LogManager$LoggerContext.demandLogger(LogManager.java:478) at java.util.logging.LogManager$LoggerContext.processParentHandlers(LogManager.java:604) at java.util.logging.LogManager$LoggerContext.addLocalLogger(LogManager.java:540) - locked <0x1b266518> (a java.util.logging.LogManager$LoggerContext) at java.util.logging.LogManager.addLogger(LogManager.java:854) at java.util.logging.LogManager.demandLogger(LogManager.java:398) at java.util.logging.Logger.demandLogger(Logger.java:352) at java.util.logging.Logger.getLogger(Logger.java:399) Thread 2: at java.util.logging.LogManager$LoggerContext.findLogger(LogManager.java:482) - waiting to lock <0x1b266518> (a java.util.logging.LogManager$LoggerContext) at java.util.logging.LogManager.setLevelsOnExistingLoggers(LogManager.java:1362) - locked <0x1b260998> (a java.util.logging.LogManager) at java.util.logging.LogManager.readConfiguration(LogManager.java:1121)