登录大容量多线程 Java 应用程序时出现死锁问题
Thread-5 被卡住,下面是线程转储。看起来像僵局吗?库:reload4j v1.2.24
logger config is as below :
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
<appender name="default" class="org.apache.log4j.AsyncAppender"> </appender>
</log4j:configuration>
AsyncAppender-Dispatcher-Thread-0" #21 daemon prio=5 os_prio=0 tid=0x00007f13d2338000 nid=0x2454d waiting for monitor entry [0x00007f13a171a000]
java.lang.Thread.State: BLOCKED (on object monitor)
at org.apache.log4j.Category.callAppenders(Category.java:192)
- waiting to lock <0x00000006c006e230> (a org.apache.log4j.spi.RootLogger)
at org.apache.log4j.Category.forcedLog(Category.java:364)
at org.apache.log4j.Category.log(Category.java:771)
at org.slf4j.impl.Log4jLoggerAdapter.log(Log4jLoggerAdapter.java:581)
at org.apache.commons.logging.impl.SLF4JLocationAwareLog.error(SLF4JLocationAwareLog.java:220)
"Thread-5" #170 prio=5 os_prio=0 tid=0x00007f13b85d1000 nid=0x2680f in Object.wait() [0x00007f1396c20000]
java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
at java.lang.Object.wait(Object.java:502)
at org.apache.log4j.AsyncAppender.append(AsyncAppender.java:190)
- locked <0x00000006c0026878> (a java.util.ArrayList)
at org.apache.log4j.AppenderSkeleton.doAppend(AppenderSkeleton.java:228)
- locked <0x00000006c007e980> (a org.apache.log4j.AsyncAppender)
at org.apache.log4j.helpers.AppenderAttachableImpl.appendLoopOnAppenders(AppenderAttachableImpl.java:56)
at org.apache.log4j.Category.callAppenders(Category.java:194)
- locked <0x00000006c006e230> (a org.apache.log4j.spi.RootLogger)
at org.apache.log4j.Category.forcedLog(Category.java:364)
at org.apache.log4j.Category.log(Category.java:771)
at org.slf4j.impl.Log4jLoggerAdapter.log(Log4jLoggerAdapter.java:581)
at org.apache.commons.logging.impl.SLF4JLocationAwareLog.info(SLF4JLocationAwareLog.java:164)
Thread-5 处于 WAITING 状态,特别是在对象监视器上等待。它在监视器上等待AsyncAppender追加日志消息。同时,“ AsyncAppender-Dispatcher-Thread-0 ”处于 BLOCKED 状态,表明它正在尝试获取RootLogger上的锁来调用追加器。
这种情况表明存在潜在的死锁,其中 Thread-5在等待其他内容(可能是资源)时持有AsyncAppender上的锁,而“AsyncAppender-Dispatcher-Thread-0”在等待调用附加程序时持有RootLogger上的锁。
要解决此死锁,您可能需要仔细检查涉及应用程序日志记录的代码路径,并确保以一致且及时的方式获取和释放锁。此外,您可能会考虑优化日志记录配置或使用对大容量多线程环境更具弹性的替代日志记录框架。