当前位置:网站首页>一种比读写锁更快的锁,还不赶紧认识一下
一种比读写锁更快的锁,还不赶紧认识一下
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:终止状态,当前线程执行完毕。
边栏推荐
- Where is the program?
- Introduction to source insight 4.0
- 金仓数据库 KingbaseES异构数据库移植指南 (2. 概述)
- API Gateway介绍
- Openresty Lua resty core use
- Kingbasees heterogeneous database migration guide (2. Overview)
- RK3399平台入门到精通系列讲解(导读篇)21天学习挑战介绍
- JVs official account login configuration
- Using dataX to realize efficient synchronization of MySQL data
- Arduino development (II)_ RGB light control method based on Arduino uno development board
猜你喜欢

CPDA|如何拥有数据分析思维?

User login switching case

说透缓存一致性与内存屏障

【深度学习】Pytorch Tensor 张量

vi工作模式(3种)以及模式切换(转换)

Tencent jumped out with 38K and saw the real test ceiling

The variable "lattice" or class "lattice.latticeeasy" (matlab) is not defined

knife4j通过js动态刷新全局参数

RK3399平台入门到精通系列讲解(导读篇)21天学习挑战介绍

How does the industrial switch enter the web management interface?
随机推荐
Vant component library
NPDP|什么样的产品经理可以被称为优秀?
JVS基础框架功能列表
Openresty Lua resty DNS domain name resolution
[numpy] array index and slice
How to translate the address in the program?
人脸识别5.1- insightface人脸检测模型训练实战笔记
Download of MySQL driver jar package -- nanny tutorial
品牌列表案例
MYSQL设计优化生成列
自定义学习率
Onion group joined hands with oceanbase to realize distributed upgrading, and global data has achieved cross cloud integration for the first time
命令行 PDF 转换器:::fCoder 2PDF
IPv4/IPv6、DHCP、网关、路由
What configurations are required to connect polardb and redis?
国际权威认可!OceanBase入选Forrester Translytical数据平台报告
Hexagon_V65_Programmers_Reference_Manual(6)
认识网络模型数据的封装和解封装
Kingbasees heterogeneous database migration guide (3. Kingbasees migration capability support system)
openresty lua-resty-dns 域名解析