Java并发编程 之 乐观锁和悲观锁

Java并发编程(16)—— 乐观锁、悲观锁和CAS算法实现 操作员 B 完成了操作,也将版本号( version=1 )试图向数据库提交数据( balance=$80 ),但此时比对数据库记录版本时发现,操作员 B 提交的数据版本号为 1 ,数据库记录当前版本也为 2 ,不满足 “ 提交版本必须等于当前版本才能执行更新 “ 的乐观锁策略,因此,操作员 B 的提交被驳回。悲观锁总是假设最坏的情况,认为共享资源每次被访问的时候就会出现问题(比如共享数据被修改),所以每次在获取资源操作的时候都会上锁,这样其他线程想拿到这个资源就会阻塞直到锁被上一个持有者释放。 阅读详情

悲观锁

可以把悲观锁想成一个很小心的人,无论做什么操作之前,都要去加个锁,这样别人想拿这个数据就会block直到它拿到锁。但是在效率方面,处理加锁的机制会产生额外的开销,还有增加产生死锁的机会。另外如果只有只读事物,这个锁是没必要的。
传统的关系型数据库里边就用到了很多这种锁机制,比如读锁,写锁等,都是在做操作之前先上锁。

悲观锁的实现

在java中,synchronized就是一种悲观锁的实现。这个很好理解,采用独占的方式来访问,每次访问都需要获取锁才可以继续进行。

乐观锁

乐观锁相较于悲观时就“乐观”多了,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制。

乐观锁不能解决脏读的问题。例如:用户A,B看到的值都是6,用户B把值改为2,用户A读到的值仍为6。

乐观锁的实现

CAS是项乐观锁技术,当多个线程尝试使用CAS同时更新同一个变量时,只有其中一个线程能更新变量的值,而其它线程都失败,失败的线程并不会被挂起,而是被告知这次竞争中失败,并可以再次尝试。

在JDK1.5 中新增java.util.concurrent(J.U.C)就是建立在CAS(compare and swap)之上的。我们以java.util.concurrent中的AtomicInteger为例,看一下在不使用锁的情况下是如何保证线程安全的。主要理解getAndIncrement方法,该方法的作用相当于 ++i 操作。

getAndIncrement采用了CAS操作,每次从内存中读取数据然后将此数据和+1后的结果进行CAS操作,如果成功就返回结果,否则重试直到成功为止。而compareAndSet利用JNI来完成CPU指令的操作。
还是不理解CAS的,点击这里看实例 。

乐观锁和悲观锁适用场景

像乐观锁适用于写比较少的情况下,即冲突真的很少发生的时候,这样可以省去了锁的开销,加大了系统的整个吞吐量。但如果经常产生冲突,上层应用会不断的进行retry,这样反倒是降低了性能,所以这种情况下用悲观锁就比较合适。

XTDrone——ALOAM与3D激光雷达三维SLAM(处理没有点云和坐标系报错的问题) 本文介绍了XTDrone中配置如何在三维环境中使用A-LOAM算法配合velodyneHDL32激光雷达包括依赖包安装、代码修改和PX4系统配置,以及相关报错细节的注意事项。 阅读详情

相关推荐

综合能源系统多时间尺度优化调度!诸多创新点让你抓住审稿人的心!

主要介绍综合能源系统的设备组成结构,并针对屋顶光伏系统、冷-热-电联供系统中的燃气轮机、燃气锅炉、光伏溴化锂制冷机、卡琳娜余热发电、中央空调系统,以及外网交互系统的配电网与天然气管网交互关系进行数学建模。1) 源-荷-储协同调度:研究屋顶光伏、燃气轮机、燃气锅炉等源侧设备,中央空调、电-热-冷负荷、可平移电负荷、可削减温控负荷等负荷侧资源,以及储能系统、电动汽车等储能侧设备的协同调度,以提高风光消纳能力,满足社会能源需求。通过电转热、电转冷、电转气等多能耦合方式,可进一步促进可再生能源的应用与发展。

weixin_48747334的博客 1488

面试必备之乐观锁与悲观锁

悲观锁总是假设最坏的情况,认为共享资源每次被访问的时候就会出现问题(比如共享数据被修改),所以每次在获取资源操作的时候都会上锁,这样其他线程想拿到这个资源就会阻塞直到锁被上一个持有者释放。也就是说,共享资源每次只给一个线程使用,其它线程阻塞,用完后再把资源转让给其它线程。像 Java 中和等独占锁就是悲观锁思想的实现。悲观锁通常多用于写多比较多的情况下(多写场景),避免频繁失败和重试影响性能。

JavaGuide 30万+

告别专业软件!用QGIS+GDAL免费搞定S-57电子海图,附全套符号库和样式文件

本文详细介绍了如何利用免费开源工具QGIS和GDAL处理S-57电子海图,包括数据转换、符号库配置和专业可视化方案。通过实战指南,用户无需依赖昂贵的商业软件,即可实现从S-57到SHP的转换及专业级海图制作,特别适合预算有限的个人和小型机构。

weixin_33701294的博客 391

Java并发系列之三:乐观锁机制

上一篇悲观锁中,我们讲到悲观锁的四种状态时,提到了“无锁”这种状态,并解释其有两种语义,一种是对共享资源不进行任何同步原语保护;另一种是共享资源会出现被竞争的情况,但是不使用操作系统同步进行保护,而是使用诸如CAS这种方式进行线程同步,这样能够尽量将获取锁释放锁的操作仅在用户空间内完成,大幅度减少操作系统用户态和内核态之间的切换次数,在很多情况下就能够提升程序性能,这也被称为“乐观锁”。

coolshyman的博客 1374

Proteus下载安装快速入门:30分钟掌握全过程

手把手教你完成proteus下载安装,从环境配置到首次运行一气呵成,适合电子设计新手快速掌握仿真工具的核心操作步骤。

weixin_31974443的博客 891

anaconda安装-超详细版

文章目录一、anaconda安装1.1 anaconda安装地址1.2 安装详细步骤检验安装是否成功更改conda源(后续安装第三方库可以加快速度) 一、anaconda安装 Anaconda 是一个用于科学计算的 Python 发行版,支持 Linux, Mac, Windows, 包含了众多流行的科学计算、数据分析的 Python 包。装anaconda,就不需要单独装python了。 anaconda优点: 1、anaconda里面集成了很多关于python科学计算的第三方库,主要是安装方便,而p

in546的博客 25万+

Java乐观锁

乐观锁是一种并发控制的策略,它假设多个线程在操作共享数据时,不会发生冲突,因此不需要加锁,而是在更新数据时,通过比较当前状态和上一次的状态,来判断是否有其他线程修改了数据。版本号控制的思想是,在数据表中增加一个版本号字段(或者时间戳字段),每次更新数据时,都将版本号加一(或者更新时间戳),并且在更新时,检查当前的版本号是否和数据库中的一致,如果一致,就执行更新操作;ABA问题是指,在一个线程执行CAS操作时,发现内存中的值没有变化(仍然为A),就认为没有其他线程修改过这个值,然后执行更新操作。

web_j2ee的博客 2788

深入解析LCD DRM驱动框架中的KMS与GEM机制

本文深入解析了Linux内核中DRM(Direct Rendering Manager)驱动框架的核心机制,重点剖析了KMS(内核模式设置)与GEM(图形执行管理器)的工作原理。KMS作为显示系统的总指挥,负责原子化地控制CRTC、Encoder、Plane等硬件资源,确保画面同步更新,避免撕裂;GEM则作为显存大管家,通过DUMB和PRIME机制高效管理图形缓冲区的分配、共享与同步。文章结合RK3568平台实战,阐述了如何利用这些机制优化显示性能,并提供了调试技巧与常见问题解决方案。

weixin_29188997的博客 387

Java乐观锁的实现原理和典型案例

在并发编程中,多个线程同时对同一资源进行操作时,需要使用锁来保证数据的一致性。乐观锁与悲观锁是两种不同的锁机制。

AI黑板报的专栏 1万+

SAP中成本估算没有找到工艺路线消息处理实例

在针对成品的标准成本核算处理过程中,系统中会经由设定好的策略来收集成品相关成本组成,最终计算出产成品的标准成本。关于成本组成,可以归纳为三个基本要素,料,工,费。即标准成本就是要知道,生产一件成品,需要消耗多少钱的原材料?消耗多少钱的人工?以及其它的间接消耗? 某日,接到CO同事的反馈,在用CK11N做产成品标准价格核算时,提示没有工艺路线确定,但该消息为绿灯,可以通过。基于业务上的谨慎,提出分析。 从提示可以看出问题与工艺路线有关。因为,成品工艺路线中设定有成品生产所耗工时,所以,在计算产成品标准

专注SAP应用技术文章写作,致力于拉近用户与系统间的距离; 6278

基于STM32、HAL库的MCP4651-503E/ST数字电位器驱动程序设计

@param channel: 通道 (0: A通道, 1: B通道)* @param channel: 通道 (0: A通道, 1: B通道)// SPI1 SCK/MISO/MOSI引脚配置。* @param hmcp: MCP4651句柄。* @param hmcp: MCP4651句柄。* @param hmcp: MCP4651句柄。* @param hmcp: MCP4651句柄。* @param hmcp: MCP4651句柄。* @param hspi: SPI句柄。

corlin6688的博客 136

什么是悲观锁和乐观锁

一、何为悲观锁、乐观锁 1、悲观锁 顾名思义,就是比较悲观的锁,总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁(共享资源每次只给一个线程使用,其它线程阻塞,用完后再把资源转让给其它线程)。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。Java中synchro...

striveb的博客 4万+

ubuntu-emto-cpa 测试和使用(单核运行)

ubuntu-emto-cpa 测试和使用(单核运行)

qq_45834835的博客 1400

第一章 Java并发编程中的乐观锁和悲观锁(上)

生活中乐观的人总是想着事情往好的方向发展,而悲观的人总是想着事情往坏的方向发展。这两种人各有优缺点,不能不以场景而定说一种人好于另外一种人。同理,乐观锁和悲观锁各有其应用场景不能一概而论。乐观锁和悲观锁是Java并发编程中的两种常见锁机制,目的是保证在并发环境下对共享资源的一致性和正确性。刚参加工作不久,使用得最多的办公软件就是飞书了。飞书中的文档支持多人实时在线协作编辑,涉及到并发控制的问题。**。

weixin_43537329的博客 1189

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

悲观锁的实现方式java_并发编程--锁--悲观锁和乐观锁

悲观锁和乐观锁并不是某个具体的“锁”而是一种并发编程的基本概念,是根据看待并发同步的角度。乐观锁和悲观锁最早出现在数据库的设计当中,后来逐渐被 Java 的并发包所引入。悲观锁悲观锁认为对于同一个数据的并发操作一定是会发生修改的,采取加锁的形式,悲观地认为,不加锁的并发操作一定会出问题。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。Java中...

weixin_30920223的博客 5233

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

java并发排它锁_Java并发编程 | 悲观锁和乐观锁机制

一、资源和加锁1、场景描述多线程并发访问同一个资源问题,假如线程A获取变量之后修改变量值,线程C在此时也获取变量值并且修改,两个线程同时并发处理一个变量,就会导致并发问题。这种并行处理数据库的情况在实际的业务开发中很常见,两个线程先后修改数据库的值,导致数据有问题,该问题复现的概率不大,处理的时候需要对整个模块体系有概念,才能容易定位问题。2、演示案例public class LockThread...

weixin_39788960的博客 73

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

【Java并发编程】之乐观锁和悲观锁

小王呀,今天我们就来聊聊乐观锁和悲观锁吧,你先介绍一下它们两者的含义! 好的!我先把乐观锁和悲观锁的含义贴出来吧! 乐观锁 总是假设最好的情况,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号机制和CAS算法实现。乐观锁适用于多读的应用类型,这样可以提高吞吐量,像数据库提供的类似于write_condition机制,其实都是提供的乐观锁。在Java中java.util.concurrent.atomic包下面的原子变量类就是使.

王廷云的博客 267

Java-并发编程-乐观锁和悲观锁

悲观锁总是假设最坏的情况,认为共享资源每次被访问的时候就会出现问题(比如共享数据被修改),所以每次在获取资源操作的时候都会上锁,这样其他线程想拿到这个资源就会阻塞直到锁被上一个持有者释放。也就是说,共享资源每次只给一个线程使用,其它线程阻塞,用完后再把资源转让给其它线程。像 Java 中和等独占锁就是悲观锁思想的实现。悲观锁通常多用于写比较多的情况下(多写场景),避免频繁失败和重试影响性能。

Java程序员的知识博客 950

java加锁失败_Java并发编程(05):悲观锁和乐观锁机制

一、资源和加锁1、场景描述多线程并发访问同一个资源问题,假如线程A获取变量之后修改变量值,线程C在此时也获取变量值并且修改,两个线程同时并发处理一个变量,就会导致并发问题。这种并行处理数据库的情况在实际的业务开发中很常见,两个线程先后修改数据库的值,导致数据有问题,该问题复现的概率不大,处理的时候需要对整个模块体系有概念,才能容易定位问题。2、演示案例publicclassLockT...

weixin_30605469的博客 346

Java并发编程(05):悲观锁和乐观锁机制

并发编程中一个最关键的问题,多线程并发处理同一个资源,防止资源使用的冲突一个关键解决方法,就是在资源上加锁多线程序列化访问。锁是用来控制多个线程访问共享资源的方式,锁机制能够让共享资源在任意给定时刻只有一个线程任务访问,实现线程任务的同步互斥,这是最理想但性能最差的方式,共享读锁的机制允许多任务并发访问资源。...

【积累】,是一个长期持续的过程。 1523

第二章 Java并发编程中的乐观锁和悲观锁(下)

在上一篇文章中,我们结合飞书文档在线并发编辑功能的实现介绍了乐观锁和悲观锁的基本概念,并讨论了它们在并发编程中的应用场景。本文将继续深入探讨这两种锁机制,重点讨论如何在实际项目中实现和优化乐观锁和悲观锁。本文深入探讨了Java并发编程中的乐观锁和悲观锁,包括实现方法、性能对比和优化策略。在实际项目中,我们需要根据具体场景选择合适的锁机制,并采取适当的优化措施,以提高系统的并发性能。掌握乐观锁和悲观锁的使用,是进行高效并发编程的重要技能。

weixin_43537329的博客 1132

**Java有哪些悲观锁的实现_Java并发编程 | 悲观锁和乐观锁机制

一、资源和加锁1、场景描述多线程并发访问同一个资源问题,假如线程A获取变量之后修改变量值,线程C在此时也获取变量值并且修改,两个线程同时并发处理一个变量,就会导致并发问题。这种并行处理数据库的情况在实际的业务开发中很常见,两个线程先后修改数据库的值,导致数据有问题,该问题复现的概率不大,处理的时候需要对整个模块体系有概念,才能容易定位问题。2、演示案例public class LockThread...

weixin_39608118的博客 181

Java并发编程——深入理解乐观锁和悲观锁

1.悲观锁 对于同一个数据的并发操作,悲观锁认为自己在使用数据的时候一定会有别的线程来修改数据,因此在获取数据的时候会先加锁,确保数据不会被别的线程修改。 这种线程一旦得到锁,其他需要锁的线程就挂起。共享资源每次只给一个线程使用,其他线程阻塞,用完再把资源转让给其他线程。传统的关系型数据库就用到很多悲观锁这种几只,比如行锁、表锁、读锁、写锁等,都是在操作之前先上锁。 2.乐观锁 乐观锁认为自己在使用数据的时候不会有别的线程来修改数据,所以不会添加锁,只是在更新数据的时候去判断之前有没有别的线程更新了这

dreamchaser533534的博客 411

JUC并发编程第四篇,Java中的各种锁之乐观锁和悲观锁、公平锁和非公平锁、可重入锁以及死锁基础

当采用非公平锁时,1个线程请求锁获取同步状态,然后释放同步状态,因为不需要考虑是否还有前驱节点,所以刚释放锁的线程,在此刻再次获取同步状态的概率就变得非常大,所以就减少了线程的开销。适合读操作多的场景,不加锁的特点能够使其读操作的性能大幅提升。公平锁保证了排队的公平性, 避免了“锁饥饿”问题。举例,从日常生活中的卖票场景理解公平锁和非公平锁。从上边的场景看公平锁和非公平锁存在的问题。默认非公平锁和公平锁存在的意义?非公平锁和公平锁源码上的差别。如何选择非公平锁和公平锁。

I wanna be myself, where I Belong. 643

java并发编程 乐观锁和悲观锁

一、悲观锁 总是假设最坏的情况,每次取数据时都认为其他线程会修改,所以都会加(悲观)锁,不加锁就会出现缓存一致性问题。一旦加锁,不同线程同时执行时,只能有一个线程执行,其他的线程在入口处等待,直到锁被释放。 悲观锁在MySQL、Java有广泛的使用 MySQL的读锁、写锁、行锁等 Java的synchronized,ReentrantLock关键字 二、乐观锁 乐观锁顾名思义就是在操作时很乐观,认...

u014207606的博客 330

Java并发编程之Java 乐观锁和悲观锁

字节跳动面试,问了我乐观锁和悲观锁的AQS、sync和Lock,这个回答让我拿了offer

yzpbright的博客 462
上一篇: Java 线程池实现的原理
下一篇: Java 类加载的生命周期
CallMeJiaGu
博客等级 码龄12年 149粉丝 99原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值