博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Bug:StampedLock的中断问题导致CPU爆满
阅读量:6245 次
发布时间:2019-06-22

本文共 1457 字,大约阅读时间需要 4 分钟。

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     forint 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 }
  • 转载自 
你可能感兴趣的文章
研究人员创建可***BIOS和网卡的恶意软件
查看>>
C++ numeric_limits的用法
查看>>
升级maildrop,解决自动回复乱码问题
查看>>
MySQL Sandbox---快速体验各版本MySQL
查看>>
我的友情链接
查看>>
CentOS安装KDE和Gnome
查看>>
非常有趣的js
查看>>
Spring 单元测试
查看>>
品读Mybatis源码---(1)解析配置文件
查看>>
android获取设备分辨率的新方法
查看>>
函数式对象之自指向
查看>>
内建控制结构之变量范围
查看>>
我的友情链接
查看>>
解决Zabbix Grafana 2.5.0.1 不支持7day趋势数据显示
查看>>
JDBC为什么要使用PreparedStatement而不是Statement
查看>>
Cloud9 on Docker镜像发送
查看>>
图片交易平台Scoopshot获120万美元投资
查看>>
去掉JSON中值为null的
查看>>
我的友情链接
查看>>
职业考试的安排-2
查看>>