今天,在JBoss EAP alpha的Java EE项目中执行被阻止("阻止" - 这应该是更具技术性的词,但此时我无法弄清楚)的情况下,我们一直在苦苦挣扎版本,之后不再有控制台消息。
最后,我们认为我的同事错误地将System.out.println()
放在for循环中,而不是slf4j
logger(循环迭代数百次)。
用System.out.println()
记录器的log.xxxxx()替换slf4j
后一切正常。
我无法理解System.out.println()
这个奇怪的问题。
此外,应用程序服务器正在运行但无法提供任何请求。
有人可以帮助我理解这个问题以及为什么JBoss无法处理其他请求。
答案 0 :(得分:0)
JBoss remapps the System.err将其输出重定向到日志记录。我想你在记录器锁和流锁之间是running into a deadlock。
Thread 1
执行logger.log->(锁定记录器) - > Console Appender-> System.err(锁定流)Thread 2
执行System.err.println->(锁定流) - > logger.log->(锁定记录器)。正如你所看到的,每个线程都以相反的顺序抓住锁。
不可能你说! org.jboss.logging.util.LoggerStream
的源代码根本没有任何同步关键字。如果LoggerStream没有锁定,它怎么会死锁?
简单,它们没有覆盖java.io.PrintStream中声明的每个方法。因此,如果您调用System.err.println(int)或System.err.println(boolean),则会遇到麻烦。