执行阻止是因为在for循环中使用System.out.println()?

时间:2015-12-09 18:16:33

标签: java java-ee logging system.out

今天,在JBoss EAP alpha的Java EE项目中执行被阻止("阻止" - 这应该是更具技术性的词,但此时我无法弄清楚)的情况下,我们一直在苦苦挣扎版本,之后不再有控制台消息。

最后,我们认为我的同事错误地将System.out.println()放在for循环中,而不是slf4j logger(循环迭代数百次)。

System.out.println()记录器的log.xxxxx()替换slf4j后一切正常

我无法理解System.out.println()这个奇怪的问题。 此外,应用程序服务器正在运行但无法提供任何请求。

有人可以帮助我理解这个问题以及为什么JBoss无法处理其他请求。

1 个答案:

答案 0 :(得分:0)

带有PrintStream的

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),则会遇到麻烦。