StampedLock悲观锁乐观锁

悲观锁、乐观锁、死锁 谈谈你对悲观锁、乐观锁以及死锁的理解??? 阅读详情

StampedLock java1.8提供的, 性能比ReadWriteLock好.

语法
	final StampedLock sl = new StampedLock();
 
	/**
 	* 悲观读锁
 	* 与ReadWriteLock的读锁相似
 	* 允许多个线程进行读操作
 	* 与写锁互斥
	**/
	//获取悲观锁
	long stamp = sl.readLock();
	try {
      //。。。。
    }finally {
   	  sl.unlockRead(stamp);
   	}


	/**
 	* 写锁
 	* 与ReadWriteLock的写锁相似
 	* 只允许一个线程进行写操作
 	* 与读锁互斥
	**/
     //获取写锁
	long stamp1 = sl.writeLock();
	try{
        //。。。
    }finally {
        //释放写锁
        sl.unlockWrite(stamp1);
    }


	/**
 	* 乐观读锁升级为悲观读
 	* 锁的严苛程度变强叫做升级,反之叫做降级
	**/
	//获取乐观锁
 	long stamp = sl.tryOptimisticRead();
	 //判断执行读操作期间,是否存在写操作,如果存在则sl.validate返回false
    if (!sl.validate(stamp)){
        //升级为悲观锁
        stamp = sl.readLock();
        try{
            //。。。
        }finally {
            //释放悲观读锁
            sl.unlockRead(stamp);
        }

StampedLock提供的乐观读,是允许一个线程获取写锁的,也就是说不是所有的写操作都是被阻塞的。

乐观读和乐观锁是不一样的,乐观读这个操作是无锁的,乐观读认为读的时候不会有写的操作。

示例
import java.util.concurrent.locks.StampedLock;

/**
 * 悲观锁乐观锁
 **/
public class Point {
    private int x;
    private int y;
    final StampedLock sl = new StampedLock();

    //计算到原点的距离
    int distanceFromOrigin() throws  Exception{
        //乐观锁
        long stamp = sl.tryOptimisticRead();
        //读入局部变量,读的过程数据可能被修改
        int curX = x;
        int curY = y;

        //判断执行读操作期间,是否存在写操作,如果存在则sl.validate返回false
        if (!sl.validate(stamp)){
            //升级为悲观锁
            stamp = sl.readLock();
            try{
                curX = x;
                curY = y;
            }finally {
                //释放悲观读锁
                sl.unlockRead(stamp);
            }
        }

        return (int)Math.sqrt(curX*curX   curY*curY);
    }
}
特征
  1. StampedLock支持三种模式: 写锁、悲观读和乐观读。
  2. 允许多 个线程同时获取乐观锁和悲观读锁。
  3. 只允许一个线程获取写锁,写锁和悲观读锁是互斥的。
  4. 使用StampedLock一定不要调用中断操作,如果需要支持中断功能,一定使用可中断的悲观读锁 readLockInterruptibly()和写锁writeLockInterruptibly()。
  5. StampedLock里的写锁和悲观读锁加锁成功之后,都会返回一个stamp;然后解锁的时候,需要传入这个 stamp。
  6. StampedLock不支持重入(ReadWriteLock支持)。
  7. StampedLock的悲观读锁、写锁都不支持条件变量。
  8. StampedLock支持锁的降级(通过tryConvertToReadLock()方法实现)和升级(通过 tryConvertToWriteLock()方法实现),但是建议你要慎重使用。
数据库中的乐观锁
  1. 在表中添加一个数值型版本号字段version。
  2. 每次更新表时都将version字段加1。
  3. 修改数据时使用主键和version作为修改条件,version一致则会修改成功。
  4. 如果修改失败,通过主键查询获取最新数据再执行修改。
多线程系列(十一) -浅析并发读写锁StampedLock 为了进一步的提升程序并发执行效率,Java 8 引入了一个新的读写锁:StampedLock。 阅读详情

相关推荐

J.U.C-AQS框架同步组件之StampedLock乐观锁悲观锁

StampedLock java1.8提供的, 性能比ReadWriteLock好. 乐观锁 乐观锁是一种乐观思想,即认为读多写少,遇到并发写的可能性低(不是没有, 所以还要加锁, 区别于不加锁的乐观读),每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,采取在写时先读出当前版本号,然后加锁操作(比较跟上一次的版本号,如果一样则更新),如果失败则要重复读-比较-写的操作。    java中的乐观锁基本都是通过CAS操作实现的,CAS是一种更新的原子操作,比较当前值跟传入值是否一样,一样则更新,否则失败。 悲观锁 悲观锁是就是悲观思想

StampedLock学习

StampedLock 学习

nobaldnolove的博客 305

基于 国产USRP B210 的通信+侦测+干扰三合一实验平台,解锁无线攻防全场景!

在当代复杂电磁环境与多样化通信需求并存的背景下,软件定义无线电(SDR)技术正展现出前所未有的系统灵活性与功能可重构性。由两台USRP-LW B210软件无线电设备模拟无线链路通信过程,能够模拟多种无线通信信号传输及图像传输场景,适用于通信协议验证、抗干扰测试及教学实验。,支持"通信-侦测-干扰-优化"的闭环实验流程,为无线通信领域的教学科研与工程应用提供了一套经济高效、功能完备的解决方案。系统可对通信链路信号进行快速、自动化侦测、识别、告警,并支持多种干扰信号生成、模式切换及效果评估功能。

luowave2012的博客 832

StampedLock使用方式

    简述:在上篇文章中介绍和分析了ReentranReadWriteLock,我们发现是可以将读写分别进行加锁,需要注意的一点就是,当读锁获取到资源的时候,如果要进行写入,不管是否是当前同一个线程都不可以,在开发中我们大部分场景其实都是读多写少,显然,如果要进行写入,需要等待所有的读操作都执行完,显然性能上就会有所降低,因此,在JDK1.8里面提供了StampedLock这个类,他里面提供了一...

summerZBH123的博客 1671

WorkBuddy驱动SolidWorks实测:AI建模流程、参数化与许可排查指南

AI辅助三维建模正在改变工程师的重复劳动方式。其核心理念不是替代人的设计决策,而是通过AI智能体接管CAD软件中的草图绘制、特征创建、尺寸修改等高频操作,让工程师从繁琐的GUI交互中解放出来。在SolidWorks这类主流CAD平台上,这类AI助手的落地依赖环境稳定、需求描述清晰和参数化建模规范。通过将外径、孔距等关键尺寸定义为全局变量并用方程式驱动,可实现改一个数、模型自动更新的高效流程;同时,遇到“无法获得许可”等环境故障时,需要按服务状态、安全软件隔离、干净卸载的顺序排查。以WorkBuddy驱动So

weixin_28559803的博客 367

matlab 三维绘图 抛光,瓷砖抛光过程建模与仿真

:瓷砖抛 光过程 建模与仿真朱 成 就(广 东工业大学 机 电工程 学院, 广东广州 )摘要 :瓷砖的抛磨影响 因素众 多 ,实际磨削加工时容易出现漏抛 、返抛现象 。对陶瓷抛光机磨头进行运动学分析 ,并基于不 同粒度号 的磨 粒在一定压力下的加工深度模型 ,探讨抛光机磨 头转 速 、横梁摆动频率 、传送速度对瓷砖抛光加工表 面均匀性 的影响,然 后结合 磨削机理使 用 对陶瓷抛光过程进行仿真 ...

weixin_36331058的博客 747

Java 多线程之 StampedLock(读写锁/乐观读锁/共享锁/排他锁)

StampedLock是Java 8引入的一种读写锁的实现,它提供了一种乐观的读锁(Optimistic Read Lock)和悲观的读锁(Pessimistic Read Lock),和写锁(Write Lock),以及对读-写冲突的解决方案。StampedLock的设计目标是在读多写少的场景下提供更高的并发性能。与传统的读写锁相比,StampedLock更加灵活和高效。

QIFU的专栏 1841

2024年上半年试题二:论性能测试方法及其应用

2025年1月,我以系统分析师的身份参与了公司OA系统的开发与建设。该系统包含的功能有打卡签到、公文流转、工资查询等。我们吸取了之前由于系统使用人数激增暴露出的短时间卡顿等问题,所以在本次开发中,我们非常重视系统的性能测试。通过自动化的测试工具模拟多种正常、峰值及异常负载条件对系统的各项性能指标进行测试。性能测试在软件的质量保证中起着重要的作用,它包括的测试内容丰富多样,常见的负载测试和压力测试都属于性能测试。

银帅 548

(十五)JUC - StampedLock锁

是jdk1.8中新增的一个读写锁,也是对jdk1.5中的读写锁ReentrantReadWriteLock的优化。当stamp返回零时,表示线程获取锁失败。当释放锁或者转换锁的时候,都要传入最初获取的stamp值。read thread 写线程没有操作成功,读锁时候写锁无法介入,传统的读写互斥。:对短的只读代码段,使用乐观模式通常可以减少争用并提高吞吐量。乐观读模式:“一句话”:读的过程中也允许写锁介入。999个读,1个写,写就悲剧了。Q:有没有比读写锁更快的锁?,戳记,long类型。

LaurenHUA的实验室 306

【2022网易雷火】游戏研发笔试-AC代码及题目分享

3个小时,4道题目,雷火的题目不在于难,更在于对细节的把控和写大模拟的耐心,花了一个半小时,AC了3.85,直接交卷退了。第一题AC,第二题AC,第三题85%,第四题AC。下面分享一下大致的题意和对应的代码,就不多说了,最近很累(代码可能会有贴错的情况,如有望指正,感谢~)。 T1-小Y抽奖 题意 n行m列个奖励格子,每次抽奖消耗一个道具。每个格子奖励的数量有限且各不相司。每个格子被抽到一次,剩余的奖励数量-1。剩余的奖励数量为0时,则不会再抽到该格子。小Y抽了好多次,但一直没有抽到最想要的..

米莱虾 9266

【Claude】Not logged in · Please run /login 报错已解决

意味着 Claude Code 没有找到任何有效凭证。直接/login——交互式首选;检查——排查环境变量污染;CI 用——自动化场景标准方案;macOS Keychain 异常——/logout/login重置;时钟偏差——校准系统时间。参考:Claude Code 官方《错误参考》"身份验证"章节、官方认证优先级文档、社区 Token 过期排查记录。

博客 9979

mysql悲观锁 语法_MySQL对于各种锁的概念理解

乐观锁乐观锁大多是基于数据版本记录机制实现,一般是给数据库表增加一个"version"字段。读取数据时,将此版本号一同读出,之后更新时,对此版本号加一。此时将提交数据的版本数据与数据库表对应记录的当前版本信息进行比对,如果提交的数据版本号大于数据库表当前版本号,则予以更新,否则认为是过期数据。比如下单操作:查询出商品信息。select (quantity, version)from t_goods...

weixin_35133182的博客 186

【C++项目】从零实现RPC框架「三」:项⽬抽象层实现

本文详细介绍了如何从零实现一个 C++ RPC(远程过程调用)框架,包括通信抽象、消息抽象、通信实现、以及消息分发器的实现。通过系统化的代码示例,展示了如何构建一个高效、灵活且可扩展的 RPC 框架。

You build it, you run it 2162

悲观锁ReentrantLock ReentrantReadWriteLock VS 乐观锁Stampedlock

文章目录前言ReentrantLockReentrantReadWriteLockStampedLockReentrantLock VS ReentrantReadWriteLock VS StampedLock结语 前言 在JDK的J.U.C包中,提供了丰富类型的锁(Lock)的能力,它们均实现了Lock接口,并扩展了不同类型的锁的实现,其中我们比较常见的锁有ReentrantLock、ReentrantReadWriteLock、StampedLock,本篇,我们就对这三种类型的锁进行横向比较,来分析其

wtopps的专栏 1690

MATLAB与ROS联合仿真——控制类功能模块介绍

MATLAB与ROS联合仿真——控制类功能模块介绍

慕羽★的博客 2353

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

【Java】并发编程的艺术:悲观锁、乐观锁与死锁管理

乐观锁的思想与悲观锁的思想相反,它总认为资源和数据不会被别人所修改,所以读取不会上锁,但是乐观锁在进行写入操作的时候。通过各种锁的实现,我们会发现锁的目的是保护一种受限资源,保证同一时刻只有一个线程能访问(ReentrantLock),或者只有一个线程能写入(ReadWriteLock)。,它认为数据很可能会被其他人所修改,所以悲观锁在持有数据的时候总会把资源 或者 数据 锁住,这样其他线程想要请求这个资源的时候就会阻塞,直到等到悲观锁把资源释放为止。如果在读取过程中有写入,版本号会发生变化,验证将失败。

weixin_71491685的博客 1161

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

乐观锁,悲观锁定义以及常见类型

具有强烈的独占和排他特性,悲观锁就是“总有刁民想害朕”的具象化,它指的是对数据被外界修改持保守态度。因此,在整个执行过程中,将处于锁定状态。所以,悲观锁是一种悲观思想,它总认为最坏的情况可能会出现,它认为数据很可能会被其他人所修改,所以悲观锁在持有数据的时候总会把资源 或者 数据 锁住,这样其他线程想要请求这个资源的时候就会阻塞,直到等到悲观锁把资源释放为止。Java 中的Synchronized 和 ReentrantLock 是一种悲观锁思想的实现,因为和不管是否持有资源,它都会尝试去加锁。

m0_72869421的博客 901

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

ReadWriteLock、StampedLock、Semaphore以及死锁总结

悲观锁(Pessimistic Locking), 具有强烈的独占和排他特性。它指的是对数据被外界修改持保守态度。因此,在整个执行过程中,将处于锁定状态。所以,悲观锁是一种悲观思想,它总认为最坏的情况可能会出现,它认为数据很可能会被其他人所修改,所以悲观锁在持有数据的时候总会把资源 或者 数据 锁住,这样其他线程想要请求这个资源的时候就会阻塞,直到等到悲观锁把资源释放为止。Java 中的Synchronized 和 ReentrantLock 是一种悲观锁思想的实现。

m0_64529944的博客 209

深入了解乐观锁、悲观锁与死锁

相对于乐观锁,悲观锁采用了悲观的态度。它假设在整个操作过程中,其他线程可能随时修改数据,因此在进行读取或写入操作时,会将数据锁定,阻止其他线程对数据的并发访问。悲观锁的实现通常依赖于底层的锁机制,如数据库的行级锁或Java中的synchronized关键字。,通过合理使用信号量,我们可以有效地控制资源的访问,避免竞争条件和死锁问题,保证系统的稳定性和性能。这样一来,我们读的数据就可能不一致,需要一点额外的代码来。当并发写入非常频繁时,可能会有较多的冲突处理,影响性能。的场景,避免了不必要的阻塞和等待。

HSQdePYZ的博客 483

【Java教程】Day15-13 多线程:线程同步——StampedLock:提升并发性能的乐观锁

在Java中,ReadWriteLock已成为多线程并发控制的常用工具。它通过区分读锁和写锁,解决了多线程同时读取的需求。然而,在一些特定场景下,ReadWriteLock仍然存在潜在的性能瓶颈。具体来说,在读线程存在时,写线程必须等待直到所有读线程释放锁,这种机制被称为悲观锁。为了进一步提升并发效率,Java 8引入了StampedLock,它在保证线程安全的同时,也优化了并发性能。

max202011161630的博客 678

StampedLock源码分析

文章目录前言乐观锁 or 悲观锁源码分析构造函数读锁相关API乐观读锁的实现读锁的获取读锁的释放写锁相关API写锁的获取写锁的释放其他API读锁转写锁写锁转读锁转乐观锁ReadLockView和WriteLockView注意事项参考资料 前言 之前已经说过了ReentrantLock ReentrantReadWriteLock,可以参考之前的博客。在ReentrantReadWriteLock源...

xindoo 1612

悲观锁和乐观锁

乐观锁(StampedLock):乐观的估计读的过程中大概率不会有写入。 悲观锁(ReadWriteLock):在读的过程中拒绝有写入,有写入必须等待。 public class Point { private final StampedLock stampedLock = new StampedLock(); private double x; private double y; public void move(double deltaX, double deltaY

古月的博客 153

乐观锁、悲观锁、死锁

多个线程在运行的过程中,都需要获取双方线程所持有的锁(资源),导致处于长期无限等待的状态。synchronized (lockA) { //获得lockA的锁//线程休眠synchronized (lockB) { //获得lockB的锁System.out.println("执行add()");} //释放lockB的锁} //释放lockA的锁synchronized (lockB) { //获得lockB的锁synchronized (lockA) { //获得lockA的锁。

m0_73514610的博客 276

JDK8新增锁StampedLock详解

1,StampedLock是做什么的? 据说它是jdk7中ReentrantReadWriteLock的增强版,是为了解决ReentrantReadWriteLock的一些不足 2,ReentrantReadWritLock有那些不足呢? ReentrantReadWritLock我们都知道(不知道的可以自行再百度哈)是读写锁,在多线程的情况下,大多数情况下是读的操作要远远多于写的操作,因此...

Ruiz_666的博客 560
上一篇: 计数器:CountDownLatch,循环栅栏:CyclicBarrier
下一篇: Smaphor(信号量)实现限流器
刘彦青-Yannis
博客等级 码龄10年 1万+粉丝 234原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

刘彦青-Yannis

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值