@Slf4j 中 log.info出现大量BLOCK 线程

xu.wang

发布于 2018.12.22 09:49 阅读 3208 评论 0

      java.lang.Thread.State: BLOCKED (on object monitor)
        at java.util.logging.StreamHandler.publish(StreamHandler.java:206)
        - waiting to lock <0x00000000c1abfdd0> (a java.util.logging.ConsoleHandler)
        at java.util.logging.ConsoleHandler.publish(ConsoleHandler.java:116)
        at java.util.logging.Logger.log(Logger.java:738)
        at org.slf4j.jul.JDK14LoggerAdapter.log(JDK14LoggerAdapter.java:582)
        at org.slf4j.jul.JDK14LoggerAdapter.info(JDK14LoggerAdapter.java:277)
        at com.wechat.api.impl.CustomerServiceImpl.sendCustomerMsgToMpUser(CustomerServiceImpl.java:167)
        at com.jtexplorer.thread.WeChatMenuClickWithBookShare.sendShareHistoryToCustomer(WeChatMenuClickWithBookShare.java:95)
        at com.jtexplorer.thread.WeChatMenuClickWithBookShare.run(WeChatMenuClickWithBookShare.java:77)
        at java.lang.Thread.run(Thread.java:748)

 

          分析:从上可看出当前线程属于BLOCKED状态(第一行);倒数前三行可看到出错的位置发生在类的某行,经检查出错位置为在线程中 log.info(Thread.getCurrentThread().getName())处。

从上面的代码中也看导致出错的原因是输出logo的时候出现的错误, waiting to lock<XX>  是在等待锁住某个对象,在此逻辑中log需要输出到控制台和日志文件,故猜测可能是再输出日志的时候由于抢夺对象发生的死锁。

 

解决办法:

百度查询可能是log4j 的问题。

解决办法与死锁原因可能不相关:由于当前项目不需要输入线程名称,故把此log删除,并将slf4j-jdk14  修改为

slf4j-log4j12,暂时未出现死锁状况。