StampedLock 支持的三种锁模式

简介: StampedLock 支持的三种锁模式

用锁最佳实践

1、永远只在更新对象的成员变量时加锁

2、永远只在访问可变的成员变量时加锁

3、永远不在调用其他对象的方法时加锁

1.写锁

2.悲观读锁

3.乐观读

相对于ReadWriteLock 有啥区别

ReadWriteLock两种模式是:读锁, 写锁。而stampedLock 支持三种,分别为 写锁,乐观读锁,乐观读。写锁和悲观读锁都是互斥的,不同的是, stampedLock 写锁和悲观读锁加锁成功之后,都会返回一个stamp ,然后解锁的时候,需要传入stamp。

示例代码

final StampedLock sl = new StampedLock(); // 获取/释放悲观读锁示意代码
long stamp = sl.readLock();
try { 
//省略业务相关代码
} finally {
 sl.unlockRead(stamp);
 }
 // 获取/释放写锁示意代码
 long stamp = sl.writeLock();
 try { 
 //省略业务相关代码
 } finally { 
 sl.unlockWrite(stamp);
 }

StampedLock 之所以能比ReadWriteLock的性能好,关键是 stampedLock 支持乐观读的方式,ReadWriteLock支持多个线程同时读,但是多个线程读的时候,所有写的操作会被阻塞;而StampedLock提供的乐观读,是应许一个线程获取写锁的,就是说不是所有的写锁操作都是被阻塞。注意这里,我们用的是“乐观读”这个词,而不是“乐观读锁”,是要提醒你,乐观读这个操作是无锁的,所以相比较 ReadWriteLock 的读锁,乐观读的性能更好一些。

class Point{
    private int x ,y;
    final StampedLock sl = new StampedLock();
    // 计算到原点的距离
    int distanceFromOrigin(){
        // 乐观读
        long stamp = sl.tryOptimisticRead();  // 这里无锁的
        // 读入局部变量
        // 读的过程数据可能被修改
        int curX = x, curY = y;
        // 判断执行读操作期间
        // 是否存在写操作,如果存在
        // 则sl.validate 返回false
        if(!s1.validate(stamp)){
            // 升级为悲观读锁
            stamp = sl.readLock();
            try{
                curX = x;
                curY = y;
            }finally{
                // 释放悲观读锁
                sl.unLockRead(stamp);
            }
        }
        return Math.sqrt(
            curX * curY + curX + curY;
        )
    }
}

StampedLock 使用注意事项

1、对于读多写少的场景StampedLock的性能很好,简单的应用场景基本上可以替代ReadWriteLock,但是StampedLock的功能仅仅是ReadWriteLock的子集,在使用的时候,还是有几个地方需要注意一下

2、StampedLock 命名上并没有增加Reentrant, 想必你已经知道,StampedLock 应该是不可重入的。事实上,的确是这样的,StampedLock 不支持重入。这个是在使用中必须要特别注意的。另外,StampedLock 悲观读锁、写锁都不支持条件变量,这个也需要你注意。

使用注意

那就是:如果线程阻塞在 StampedLock 的 readLock() 或者 writeLock() 上时,此时调用该阻塞线程的 interrupt() 方法,会导致 CPU 飙升。例如下面的代码中,线程 T1 获取写锁之后将自己阻塞,线程 T2 尝试获取悲观读锁,也会阻塞;如果此时调用线程 T2 的 interrupt() 方法来中断线程 T2 的话,你会发现线程 T2 所在 CPU 会飙升到 100%。

final StampedLock = new StampedLock();
Thread T1 = new Thread(() -> {
  // 获取写锁
  lock.writeLock();
  // 永远阻塞在此处,不释放写锁
  LockSupport.park();
});
T1.start();
// 保证T1获取写锁
Thread.sleep(100);
Thread T2 = new Thread(() -> {
   // 阻塞在悲观读锁
   lock.readLock();
});
T2.start();
// 保证T2阻塞读锁
Thread.sleep(100);
// 中断线程T2
// 会导致线程T2所在CPU 飙升、
T2.interrupt();
T2.join();

所以,使用 StampedLock 一定不要调用中断操作,如果需要支持中断功能,一定使用可中断的悲观读锁 readLockInterruptibly() 和写锁 writeLockInterruptibly()。这个规则一定要记清楚。

StampedLock 读模板:

final StampedLock sl = new StampedLock();
// 乐观锁
long stamp = sl.tryOptimisticRead();
// 读入方法局部变量
// ...
// 校检stamp
if(!sl.validate(stamp)){
    // 升级为悲观读锁
    stamp = sl.readLock();
    try{
        // 读入方法局部变量
        .....
    }finally{
        // 释放悲观读锁
        sl.unLockRead(stamp);
    }
}
// 使用方法局部变量执行业务操作

StampedLock 写模板

long stamp = sl.writeLock();
try{
    // 写共享变量
    .....
}finally{
    sl.unlockWrite(stamp);
}
目录
相关文章
|
达摩院 Java 测试技术
最新迭代|FunASR离线文件转写软件包2.0
最新迭代|FunASR离线文件转写软件包2.0
1067 0
|
11月前
|
机器学习/深度学习 人工智能 算法
量子计算与化学:分子模拟的新技术
量子计算在化学领域的应用正逐步改变分子模拟的传统方式。基于量子力学原理,量子计算机能高效处理复杂分子的量子态,优化分子结构,模拟化学反应及电子结构计算,为新材料设计、药物研发等提供新途径。尽管当前技术仍面临稳定性与可扩展性的挑战,但其未来发展前景广阔,有望为化学研究带来革命性变化。
440 35
|
8月前
|
人工智能 NoSQL Redis
Collaborative Gym:斯坦福人机协作框架开源!异步交互+三方感知,让你的AI学会主动补位
介绍Collaborative Gym,一个专注于人机协作的框架,支持异步交互和多种任务环境。
227 14
Collaborative Gym:斯坦福人机协作框架开源!异步交互+三方感知,让你的AI学会主动补位
|
8月前
|
SQL 人工智能 数据可视化
数据团队必读:智能数据分析文档(DataV Note)五种高效工作模式
数据项目复杂,涉及代码、数据、运行环境等多部分。随着AI发展,数据科学团队面临挑战。协作式数据文档(如阿里云DataV Note)成为提升效率的关键工具。它支持跨角色协同、异构数据处理、多语言分析及高效沟通,帮助创建知识库,实现可重现的数据科学过程,并通过一键分享报告促进数据驱动决策。未来,大模型AI将进一步增强其功能,如智能绘图、总结探索、NLP2SQL/Python和AutoReport,为数据分析带来更多可能。
322 21
|
12月前
|
数据采集 机器学习/深度学习
港大发布智能交通大模型全家桶OpenCity!打破时空零样本预测壁垒,训练速度最多提升50倍
【10月更文挑战第15天】香港大学近日发布了智能交通大模型OpenCity,旨在通过创新技术手段解决城市交通预测和管理难题。OpenCity结合了Transformer和图神经网络(GNN)的优势,能够有效捕捉复杂时空依赖关系,实现零样本预测。该模型采用大规模异构交通数据集预训练,显著提升了泛化能力和训练速度,实验结果显示其在未见过的城市或区域的交通预测中表现出色。然而,模型的计算资源需求和数据质量仍需进一步优化。
183 1
|
12月前
|
Kubernetes Ubuntu NoSQL
harbor镜像仓库自建
harbor镜像仓库自建
|
JSON 安全 API
淘宝 API 接口:解锁商品详情的强大工具
淘宝API接口在电商领域扮演着关键角色,为商家和开发者提供强大的数据支持和服务能力。它不仅帮助商家获取商品信息、管理订单和物流,还支持数据分析、价格调整等功能,助力商家在竞争激烈的市场中取得成功。此外,通过注册认证、搭建开发环境等步骤,开发者可快速上手并利用丰富的技术文档和社区支持进行高效开发。
|
机器学习/深度学习 自然语言处理
一文搞懂Transformer的位置编码
一文搞懂Transformer的位置编码
4014 2
|
Ubuntu Oracle 关系型数据库
Linux操作系统最著名的两大系列Red Hat和Debian
Linux操作系统最著名的两大系列Red Hat和Debian
570 2
|
分布式计算 DataWorks NoSQL
MaxCompute产品使用合集之如何操作和管理节点
MaxCompute作为一款全面的大数据处理平台,广泛应用于各类大数据分析、数据挖掘、BI及机器学习场景。掌握其核心功能、熟练操作流程、遵循最佳实践,可以帮助用户高效、安全地管理和利用海量数据。以下是一个关于MaxCompute产品使用的合集,涵盖了其核心功能、应用场景、操作流程以及最佳实践等内容。
270 0