Bug:StampedLock的中断问题导致CPU爆满
StampedLock作为JAVA8中出现的新型锁,很可能在大多数场景都可以替代ReentrantReadWriteLock。它对于读/写都提供了四个接口(换成write为写锁):
- readLock()
- tryReadLock()
- tryReadLock(long time, TimeUnit unit)
- readLockInterruptibly()
这几个方法对应的语义为:
- 获取读锁(阻塞,不响应中断)
- 获取读锁(立即)
- 限时获取读锁(响应中断)
- 获取读锁(阻塞,响应中断)
[code lang=”java”]
public class TestStampedLock {
public static void main(String[] args) throws InterruptedException{
final StampedLock lock = new StampedLock();
new Thread(){
public void run(){
long readLong = lock.writeLock();
LockSupport.parkNanos(6100000000L);
lock.unlockWrite(readLong);
}
}.start();
Thread.sleep(100);
for( int i = 0; i < 3; ++i)
new Thread(new OccupiedCPUReadThread(lock)).start();
}
private static class OccupiedCPUReadThread implements Runnable{
private StampedLock lock;
public OccupiedCPUReadThread(StampedLock lock){
this.lock = lock;
}
public void run(){
Thread.currentThread().interrupt();
long lockr = lock.readLock();
System.out.println(Thread.currentThread().getName() + " get read lock");
lock.unlockRead(lockr);
}
}
}
[/code]
[code lang=”java”]
boolean interrupted = false;
[/code]
[code lang=”java”]
if(interrupted)
Thread.currentThread().interrupt();
return ns;
[/code]
[code lang=”java”]
if(Thread.interrupted()){
if(interruptible)
return cancelWaiter(node, p, true);
else
interrupted = true;
}
[/code]
原创文章,转载请注明: 转载自并发编程网 – ifeve.com本文链接地址: Bug:StampedLock的中断问题导致CPU爆满
中断状态,很多时候确实被忽略了,之前也碰到tomcat nio+servlet异步,在中断状态下计数器泄漏问题,tomcat最新版也刚修复
嗯,这些基础模块的实现还是要仔细考虑才行
如果作者解释下为什么没有使用“保存/复原中断状态”的机制就会造成cpu满负荷,读者可能更容易理解一些。
我补充两句吧,因为实现等待的那部分逻辑在一个循环里,里面有一个LockSupport.pack来实现等待,满足条件后才跳出循环,结束等待,但如果线程处于中断状态,LockSupport.pack不会开始等待或继续等待,而且也不会清除线程的中断状态,所以造成了在循环里无限调用
LockSupport.pack(pack总是立即返回)的情形,所以cpu就满负荷了
对的,说的很清楚.
貌似有点拆台的味道了,Sorry!
我看文章的时候正好有此疑惑,自己弄明白后,就把它写下来了:)
晕,不会呀,你只是就事论事呀,我没写出来是考虑到循环逻辑本身是不好理解的,所以重点给出了每个人都可以重现问题的代码。你这个评论也可以帮助其他读者理解,这很好的:)
看了下,没明白呀。Thread.currentThread().interrupt();代码注释掉,也没什么
Thread.currentThread().interrupt();不要注释掉,跑示例代码看CPU使用率,如果你电脑是4核的话CPU会持续75%左右。