java block线程数多6,使用apache log解决高并发下log4j引起大量线程block问题

"http-saoma%2F192.168.6.162-8097-184" daemon prio=10 tid=0x00002aaab0ecc800 nid=0x2d7a waiting for monitor entry [0x0000000045fa9000]

java.lang.Thread.State: BLOCKED (on object monitor)

at org.apache.log4j.Category.callAppenders(Category.java:204)

- waiting to lock <0x00000007800020a0> (a org.apache.log4j.spi.RootLogger)

at org.apache.log4j.Category.forcedLog(Category.java:391)

at org.apache.log4j.Category.log(Category.java:856)

at org.slf4j.impl.Log4jLoggerAdapter.info(Log4jLoggerAdapter.java:304)

通过日志结果可以看出问题是出在org.apache.log4j.Category.callAppenders方法中,下面是该方法的代码:

/**

Call the appenders in the hierrachy starting at

this. If no appenders could be found, emit a

warning.

This method calls all the appenders inherited from the

hierarchy circumventing any evaluation of whether to log or not

to log the particular log request.

@param event the event to log.

*/

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);

}

}

我们从上面可以看出在该方法中有个synchronized同步锁,同步锁就会导致线程竞争,那么在大并发情况下将会出现性能问题,同会引

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java线程中,锁的使用是为了控制对共享资源的访问,以避免多个线程同时对同一资源进行修改而导致数据不一致或竞态条件的问题Java提供了两种锁的机制:synchronized关键字和Lock接口。 1. synchronized关键字: - synchronized关键字可以用来修饰方法或代码块,使其成为同步方法或同步块。 - 当一个线程访问同步方法或同步块时,会自动获取该方法或代码块所在对象的锁,并在执行完后释放锁。 - 其他线程在获取锁之前会被阻塞,直到锁被释放。 - 示例代码: ```java public synchronized void synchronizedMethod() { // 同步方法 } public void synchronizedBlock() { synchronized (this) { // 同步块 } } ``` 2. Lock接口: - Lock接口是Java提供的显示锁机制,提供了更灵活的锁定方式。 - Lock接口的常用实现类是ReentrantLock,它具有与synchronized相似的语义。 - 示例代码: ```java Lock lock = new ReentrantLock(); public void lockMethod() { lock.lock(); try { // 加锁的代码 } finally { lock.unlock(); // 必须在finally块中释放锁,以防止异常导致锁无法释放 } } ``` 在使用锁时,需要注意以下几点: - 锁的粒度应尽量小,只锁定必要的代码块,以减少线程间的竞争。 - 避免死锁,即多个线程相互等待对方释放锁的情况。 - 保证锁的正确使用,避免忘记释放锁或错误地释放锁,可以使用try-finally语句块来确保锁的释放。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值