当前位置:网站首页>一种比读写锁更快的锁,还不赶紧认识一下
一种比读写锁更快的锁,还不赶紧认识一下
2022-07-27 18:32:00 【InfoQ】
什么是StampedLock?
StampedLock三种锁模式
public class StampedLockDemo{
//创建StampedLock锁对象
public StampedLock stampedLock = new StampedLock();
//获取、释放读锁
public void testGetAndReleaseReadLock(){
long stamp = stampedLock.readLock();
try{
//执行获取读锁后的业务逻辑
}finally{
//释放锁
stampedLock.unlockRead(stamp);
}
}
//获取、释放写锁
public void testGetAndReleaseWriteLock(){
long stamp = stampedLock.writeLock();
try{
//执行获取写锁后的业务逻辑。
}finally{
//释放锁
stampedLock.unlockWrite(stamp);
}
}
}class Point {
private double x, y;
private final StampedLock sl = new StampedLock();
void move(double deltaX, double deltaY) { // an exclusively locked method
long stamp = sl.writeLock();
try {
x += deltaX;
y += deltaY;
} finally {
sl.unlockWrite(stamp);
}
}
double distanceFromOrigin() { // A read-only method
long stamp = sl.tryOptimisticRead();
double currentX = x, currentY = y;
if (!sl.validate(stamp)) {
stamp = sl.readLock();
try {
currentX = x;
currentY = y;
} finally {
sl.unlockRead(stamp);
}
}
return Math.sqrt(currentX * currentX + currentY * currentY);
}
void moveIfAtOrigin(double newX, double newY) { // upgrade
// Could instead start with optimistic, not read mode
long stamp = sl.readLock();
try {
while (x == 0.0 && y == 0.0) {
long ws = sl.tryConvertToWriteLock(stamp);
if (ws != 0L) {
stamp = ws;
x = newX;
y = newY;
break;
}
else {
sl.unlockRead(stamp);
stamp = sl.writeLock();
}
}
} finally {
sl.unlock(stamp);
}
}
}double distanceFromOrigin() { // A read-only method
//乐观读
long stamp = sl.tryOptimisticRead();
double currentX = x, currentY = y;
//判断是否有线程对变量进行了写操作
//如果有线程对共享变量进行了写操作
//则sl.validate(stamp)会返回false
if (!sl.validate(stamp)) {
//将乐观读升级为悲观读锁
stamp = sl.readLock();
try {
currentX = x;
currentY = y;
} finally {
//释放悲观锁
sl.unlockRead(stamp);
}
}
return Math.sqrt(currentX * currentX + currentY * currentY);
}StampedLock实现思想
while (pred.locked) {
//省略操作
}StampedLock的注意事项
StampedLock不支持重入
StampedLock不支持条件变量
StampedLock使用不当会导致CPU飙升
public void testStampedLock() throws Exception{
final StampedLock lock = new StampedLock();
Thread thread01 = new Thread(()->{
// 获取写锁
lock.writeLock();
// 永远阻塞在此处,不释放写锁
LockSupport.park();
});
thread01.start();
// 保证thread01获取写锁
Thread.sleep(100);
Thread thread02 = new Thread(()->
//阻塞在悲观读锁
lock.readLock()
);
thread02.start();
// 保证T2阻塞在读锁
Thread.sleep(100);
//中断线程thread02
//会导致线程thread02所在CPU飙升
thread02.interrupt();
thread02.join();
}
- NEW:初始状态,线程被构建,但是还没有调用start()方法。
- RUNNABLE:可运行状态,可运行状态可以包括:运行中状态和就绪状态。
- BLOCKED:阻塞状态,处于这个状态的线程需要等待其他线程释放锁或者等待进入synchronized。
- WAITING:表示等待状态,处于该状态的线程需要等待其他线程对其进行通知或中断等操作,进而进入下一个状态。
- TIME_WAITING:超时等待状态。可以在一定的时间自行返回。
- TERMINATED:终止状态,当前线程执行完毕。
边栏推荐
猜你喜欢
![[Numpy] 广播机制(Broadcast)](/img/1f/8d61ac7b35a82067bc0b77426590eb.png)
[Numpy] 广播机制(Broadcast)

Go --- automatic recompilation of air

未定义变量 “Lattice“ 或类 “Lattice.latticeEasy“(Matlab)

People call this software testing engineer. You're just making a living (with HR interview Dictionary)
![[Numpy] 数组属性](/img/eb/a27c24deeb7951828cdfbaa88c059c.png)
[Numpy] 数组属性

sql编码bug

JVS基础介绍

关于栈迁移的那些事儿
![[program life]](/img/68/9a337d37490ad5cd75095cc5efd5e4.jpg)
[program life] "stage summary" - unwilling to be ordinary

How to improve the picture transmission speed and success rate in the development of IM instant messaging under the mobile network
随机推荐
Arduino development (II)_ RGB light control method based on Arduino uno development board
Typroa 拼写检查: 缺少对于 中文 的字典文件
IOU 目标跟踪其二:VIOU Tracker
金仓数据库 KingbaseES异构数据库移植指南 (2. 概述)
Kingbasees heterogeneous database migration guide (2. Overview)
Download of MySQL driver jar package -- nanny tutorial
JVs official account login configuration
Hexagon_V65_Programmers_Reference_Manual(7)
【R语言】【1】初学R语言语法使用Rstudio编辑
Slim: self supervised point cloud scene flow and motion estimation (iccv 2021)
Things about stack migration
国际权威认可!OceanBase入选Forrester Translytical数据平台报告
Laboratory management system implemented by SSM framework +jsp [source code + database + system paper]
Arduino开发(二)_基于Arduino UNO开发板的RGB灯光控制方法
How does the industrial switch enter the web management interface?
Go --- automatic recompilation of air
JVS基础介绍
命令行 PDF 转换器:::fCoder 2PDF
Automatic test solution based on ATX
UE5使用DLSS(超级采样)提升场景的 FPS 远离卡顿的优化方案