针对log4j 1.2.15中的并发锁问题,到底是io瓶颈,还是锁竞争导致线程block?

发布于 2022-09-07 15:38:13 字数 1336 浏览 8 评论 0

http://dikar.iteye.com/blog/1...

该文章指出使用读写锁来解决线程block的问题:我倾向于IO瓶颈是最重要的因素;另外我对他文末提供的关于每个调用处static 一个Logger的做法并不能解决锁竞争的问题
博文内容如下:
经常在高并发下就遇到log4j用错引起的线程block住的问题,看经常遇到问题的代码段如下:

Java代码

public void callAppenders(LoggingEvent event) {  
 int writes = 0;  

 for(Category c = this; c != null; c=c.parent) {  
 // Protected against simultaneous call to addAppender, removeAppender,... 
 synchronized(c) {  
 if(c.aai != null) {  
      writes += c.aai.appendLoopOnAppenders(event);  
    }  
 if(!c.additive) {  
 break;  
    }  
      }  
    }  

 if(writes == 0) {  
      repository.emitNoAppenderWarning(this);  
    }  
  }  

在内部会有个同步块,伴随着这个同步块可能会引起一个锁竞争导致cpu感觉像是hang住一样。
针对这个问题已经有了bug,见 https://issues.apache.org/bug...
同时针对这个bug也提出了新的解决方案,使用rw lock。
不过如果不升级log4j,在误用的情况下还是会出现这个问题。针对这个说下正确的使用方法,同事给出来最佳使用方法可以避免这个问题,很简单log对象每次使用时都需要是static的,说明白点就是
Java代码

private static final Log log = LogFactory.getLog("xxx");
顺便刚好有一篇和log4J 死锁相关的文章
Log4j Thread Deadlock - A Case Study
http://java.dzone.com/article...

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文