Bug:StampedLock的中断问题导致CPU爆满

StampedLock作为JAVA8中出现的新型锁,很可能在大多数场景都可以替代ReentrantReadWriteLock。它对于读/写都提供了四个接口(换成write为写锁):

  • readLock()
  • tryReadLock()
  • tryReadLock(long time, TimeUnit unit)
  • readLockInterruptibly()

这几个方法对应的语义为:

  • 获取读锁(阻塞,不响应中断)
  • 获取读锁(立即)
  • 限时获取读锁(响应中断)
  • 获取读锁(阻塞,响应中断)

然而在readLock方法(即不响应中断)中存在问题(write的版本也是),观察CPU使用率,执行以下代码:

01 public class TestStampedLock {
02     public static void main(String[] args) throws InterruptedException{
03     final StampedLock lock = new StampedLock();
04     new Thread(){
05        public void run(){
06        long readLong = lock.writeLock();
07        LockSupport.parkNanos(6100000000L);
08        lock.unlockWrite(readLong);
09      }
10     }.start();
11     Thread.sleep(100);
12     for( int i = 0; i < 3; ++i)
13        new Thread(new OccupiedCPUReadThread(lock)).start();
14     }
15     private static class OccupiedCPUReadThread implements Runnable{
16         private StampedLock lock;
17         public OccupiedCPUReadThread(StampedLock lock){
18             this.lock = lock;
19         }
20         public void run(){
21             Thread.currentThread().interrupt();
22             long lockr = lock.readLock();
23             System.out.println(Thread.currentThread().getName() + " get read lock");
24             lock.unlockRead(lockr);
25         }
26     }
27 }

先开启一个线程获取写锁并保持6秒,再开启三个带着中断状态的线程去获取读锁(readLock方法),结果是3个核心被占据了近6秒。

原因在于没有使用保存/复原中断状态的机制,通过hack源码,插入保存中断和返回前恢复中断的相关代码即可修复:

1 boolean interrupted = false;
1 if(interrupted)
2     Thread.currentThread().interrupt();
3 return ns;
1 if(Thread.interrupted()){
2     if(interruptible)
3         return cancelWaiter(node, p, true);
4     else
5         interrupted = true;
6 }
时间: 2024-10-31 19:21:12

Bug:StampedLock的中断问题导致CPU爆满的相关文章

不正当使用HashMap导致cpu 100%的问题追究

因最近hashmap误用引起的死循环又发生了一些案例,左耳朵浩子写了一篇blog 疫苗:Java HashMap的死循环,看了一下,大家的分析如出一辙.这篇blog也是好几年前写的了,之前在平台技术部的博客上贴过,随着组织结构的调整,那个博客可能不再维护,把这篇文章在这儿也保存一下. 李鹏同学在blog里写了篇关于HashMap死锁模拟的文章: http://blog.csdn.net/madding/archive/2010/08/25/5838477.aspx 做个纠正,那个不是死锁问题,而

【故障处理】序列cache值过小导致CPU利用率过高

[故障处理]序列cache值过小导致CPU利用率过高 1  BLOG文档结构图       2  前言部分 2.1  导读和注意事项 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道的知识,~O(∩_∩)O~: ① enq: SQ - contention等待事件的解决 ② 一般等待事件的解决办法 ③ DFS lock handle等待事件 ④ 与序列有关的等待事件   Tips: ① 本文在ITpub(http://blog.itpub.net/26736162)

快速找出php中可能导致cpu飙升问题的代码行

用cpu接近100%时,你如何找到导致cpu飙升的原因?我的思路是,首先找到进程正在执行的代码行,从而确定可能有问题的代码段.然后,再仔细分析有问题的代码段,从而找出原因. 如果你的程序使用的是c.c++编写,那么你可以很容易的找到正在执行的代码行.但是,程序是php编写的,如何找到可能有问题的代码行呢?这个问题就是本文要解决的问题. 背景知识: 大家都知道php是一个解释性语言.用户编写的php代码会生成opcode,由解释器引擎去解释执行.在解释执行过程中,有一个全局变量包含了执行过 程中用

cpu-mysql锁表会导致CPU占用很高么,求答案,。。。。。。。。

问题描述 mysql锁表会导致CPU占用很高么,求答案,........ 今天发布的项目锁表了,导致后面CPU超高,是锁表的原因么...... 解决方案 你这样子问,很难回答,只能说有可能

求救-网站服务器被CC攻击,导致cpu高达100%。请教高手解决方法!

问题描述 网站服务器被CC攻击,导致cpu高达100%.请教高手解决方法! 网站服务器被CC攻击,w3pw进程超过25%导致cpu高达100%.请教高手解决方法!

Linux主机肉鸡木马minerd导致CPU跑满

Linux主机挖矿木马minerd导致CPU跑满 [问题现象] Linux主机CPU跑满,或者使用服务器越来越慢,以及收到报警信息提示服务器有对外恶意扫描. 这个现象的第一反应就是服务器被黑了,遇到这种情况首先要做的是对服务器进行一下数据备份,通过阿里云的快照备份功能是可以快速的实现对服务器以及系统内部数据的备份的. [问题原因] 这种状况在出现时通过top命令可以看到有一个minerd进程占用CPU较高. 经定位,该进程是一个挖矿程序,通过上述截图可以看到进程对应的PID为1170,根据进程I

Linux 多核下绑定硬件中断到不同 CPU(IRQ Affinity)

转载 - Linux 多核下绑定硬件中断到不同 CPU(IRQ Affinity) 作者 digoal 日期 2016-11-20 标签 Linux , IRQ , 中断 , CPU亲和 , 绑定中断处理CPU 背景 原文 http://www.vpsee.com/2010/07/load-balancing-with-irq-smp-affinity/ 原文 硬件中断发生频繁,是件很消耗 CPU 资源的事情,在多核 CPU 条件下如果有办法把大量硬件中断分配给不同的 CPU (core) 处理

cpu-zedGraph控件刷新导致CPU增加过快,求解决方法

问题描述 zedGraph控件刷新导致CPU增加过快,求解决方法 zedGraph控件刷新次数越多CPU增加越快,求大神帮助下,困扰好久了

SQLSERVER 导致CPU 100%怎么解决!

问题描述 网站10分钟内同时在线3500人,导致CPU100%.服务器X3330CPU.4G内存是不是数据库结构的还是SQLSERVER的优化没做好?求助 解决方案 解决方案二:有可能,或者用多台sqlserver做cluster?解决方案三:引用1楼findcaiyzh的回复: 有可能,或者用多台sqlserver做cluster? UP解决方案四:换CPU!解决方案五:对sql语句优化减少cpu占用时长换个强大的cpu或者考虑多服务器集群模式集群我没用用过但集群可以解决这个问题解决方案六:用