什么是悲观锁、乐观锁?
一、什么是悲观锁、乐观锁
基本概念
乐观锁和悲观锁是两种思想,用于解决并发场景下的数据竞争问题。
乐观锁:乐观锁在操作数据时非常乐观,认为别人不会同时修改数据。因此乐观锁不会上锁,只是在执行更新的时候判断一下在此期间别人是否修改了数据:如果别人修改了数据则放弃操作,否则执行操作。悲观锁:悲观锁在操作数据时比较悲观,认为别人会同时修改数据。因此操作数据时直接把数据锁住,直到操作完成后才会释放锁;上锁期间其他人不能修改数据。优缺点和适用场景
乐观锁和悲观锁并没有优劣之分,它们有各自适合的场景;下面从两个方面进行说明。
1、功能限制
与悲观锁相比,乐观锁适用的场景受到了更多的限制,无论是CAS还是版本号机制。
例如,CAS只能保证单个变量操作的原子性,当涉及到多个变量时,CAS是无能为力的,而synchronized则可以通过对整个代码块加锁来处理。再比如版本号机制,如果query的时候是针对表1,而update的时候是针对表2,也很难通过简单的版本号来实现乐观锁。
2、竞争激烈程度
如果悲观锁和乐观锁都可以使用,那么选择就要考虑竞争的激烈程度:
当竞争不激烈 (出现并发冲突的概率小)时,乐观锁更有优势,因为悲观锁会锁住代码块或数据,其他线程无法同时访问,影响并发,而且加锁和释放锁都需要消耗额外的资源。
当竞争激烈(出现并发冲突的概率大)时,悲观锁更有优势,因为乐观锁在执行更新时频繁失败,需要不断重试,浪费CPU资源。
延伸阅读:
二、CAS功能限制
CAS的功能是比较受限的,例如CAS只能保证单个变量(或者说单个内存值)操作的原子性,这意味着:(1)原子性不一定能保证线程安全,例如在Java中需要与volatile配合来保证线程安全;(2)当涉及到多个变量(内存值)时,CAS也无能为力。
除此之外,CAS的实现需要硬件层面处理器的支持,在Java中普通用户无法直接使用,只能借助atomic包下的原子类使用,灵活性受到限制。

猜你喜欢LIKE
相关推荐HOT
更多>>
数字图像与模拟图像有什么区别?
一、数字图像与模拟图像的区别数字图像和模拟图像是两种不同的图像类型,它们的区别如下:1、表示方式不同数字图像是由像素点组成的离散图像,...详情>>
2023-10-16 21:36:29
JavaScript能达到什么效果?
一、动态内容与交互JavaScript可以让网页具有动态性和交互性,为用户提供更丰富的使用体验。动态内容:通过JavaScript,开发人员可以动态地修改...详情>>
2023-10-16 19:30:58
Webpack和Babel有哪些区别?
一、Webpack和Babel的区别1、功能区别Webpack主要用于模块打包和资源管理。它可以将多个JavaScript、CSS、图片等资源打包成一个或多个文件,并...详情>>
2023-10-16 16:36:33
Flash为什么被淘汰了?
一、Flash被淘汰的原因1、有安全漏洞随着历年来使用Flash的网站数量不断增加,不断出现大量安全漏洞,安装Flash之后,电脑一般情况下就会弹出大...详情>>
2023-10-16 14:32:22热门推荐
Web服务器跟WAS服务器有什么区别?
沸传真和扫描有哪些区别?
热Eclipse保存生成class文件,与编译后生成的class有哪些区别?
热幂等性和原子性有哪些区别?
新CR LF和LF有什么区别?
数字图像与模拟图像有什么区别?
chatgpt有哪些作用?
ip地址和硬件地址的区别?
Spring Boot 和 Spring Cloud有哪些区别?
JavaScript能达到什么效果?
.NET Web应用中为什么要使用async/await异步编程?
Python的闭包是什么?
PHP-FPM是个什么东西?
什么是悲观锁、乐观锁?
技术干货






