登录大容量多线程 Java 应用程序时出现死锁问题

问题描述 投票:0回答:1

登录大容量多线程 Java 应用程序时出现死锁问题

Thread-5 被卡住,下面是线程转储。看起来像僵局吗? 库:reload4j v1.2.24

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)

java logging deadlock
1个回答
0
投票

Thread-5 处于 WAITING 状态,特别是在对象监视器上等待。它在监视器上等待 AsyncAppender 追加日志消息。同时,“AsyncAppender-Dispatcher-Thread-0”处于 BLOCKED 状态,表明它正在尝试获取 RootLogger 上的锁来调用附加程序。

这种情况表明存在潜在的死锁,其中 Thread-5 在等待其他内容(可能是资源)时在 AsyncAppender 上持有锁,而“AsyncAppender-Dispatcher-Thread-0”在 RootLogger 上持有锁,同时等待调用 appenders

要解决此死锁,您可能需要仔细检查涉及应用程序中日志记录的代码路径,并确保以一致且及时的方式获取和释放锁。此外,您可能会考虑优化日志记录配置或使用对大容量多线程环境更具弹性的替代日志记录框架。

© www.soinside.com 2019 - 2024. All rights reserved.