zl程序教程

您现在的位置是:首页 >  其他

当前栏目

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

BUGCPU 导致 中断 问题
2023-09-14 08:56:48 时间

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

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

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

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

然而在readLock方法(即不响应中断)中存在问题(write的版本也是),观察CPU使用率,执行以下代码:
先开启一个线程获取写锁并保持6秒,再开启三个带着中断状态的线程去获取读锁(readLock方法),结果是3个核心被占据了近6秒。 原因在于没有使用保存/复原中断状态的机制,通过hack源码,插入保存中断和返回前恢复中断的相关代码即可修复:
ali清英 方腾飞,花名清英,英文名kiral,并发编程网创始人,支付宝技术专家,《Java并发编程的艺术》作者。