java线程已阻止 等待中_java-线程转储被阻止并锁定

这类似于Java thread dump: BLOCKED thread without “waiting to lock …”.

基本上,我看到了一个BLOCKED线程,但是它具有等待的锁:

"pool-1-thread-60" prio=10 tid=0x00007fbf10017000 nid=0x210 waiting for monitor entry [0x00007fbed64e3000]

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

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

- locked <0x0000000742444ad0> (a org.apache.log4j.Logger)

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

at org.apache.log4j.Category.info(Category.java:666)

...

我希望看到-等待锁定< 0x0000000742444ad0> …而不是-锁定….另一个问题表明是垃圾回收的原因,但是如果那样的话,不是所有线程都被阻塞了吗?还有其他线程是可运行的.另外,我怎么能证明是这种情况?为什么这是观察到的行为?我不想盲目地假设它是垃圾收集器,只是几天后才发现它是其他东西.

==辅助信息==

尽管我认为与当前问题无关,但这是上述转储来自的代码部分.

for(Category c = this; c != null; c=c.parent) {

// Protected against simultaneous call to addAppender, removeAppender,...

synchronized(c) { //line 204

if(c.aai != null) {

writes += c.aai.appendLoopOnAppenders(event);

}

if(!c.additive) {

break;

}

}

}

显然,在那条线上需要获得一个锁.但是,当线程在此监视器上真正被阻塞时,线程转储中的输出看起来像(来自同一转储):

"pool-1-thread-44" prio=10 tid=0x00007fbef0051000 nid=0x200 waiting for monitor\n entry [0x00007fbed74f3000]

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

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

- waiting to lock <0x0000000742444ad0> (a org.apache.log4j.Logger)

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

at org.apache.log4j.Category.info(Category.java:666)

...

我感兴趣的转储部分看起来有所不同(“锁定”而不是“等待锁定”).我调试了许多死锁,并查看了许多线程转储.我总是看到的是“等待锁定”.我从未见过“锁定”线程,但仍“等待监视器进入”线程,我想知道这意味着什么.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值