java中的锁---乐观锁与悲观锁的区别
锁,是开发中不得不掌握的一个知识点. 在面试中也会经常问到.其中乐观锁与悲观锁为最常见.首先介绍下两种锁
一:乐观锁:
1 介绍:
它的心态很好,每次别人使用它的时候,它会乐观的认为别人不修改数据,所以不加锁.极大的提高效率.适用于读比较多的场景
2 实现:
常用的实现方式为CAS算法 : compare and swap(比较与交换)
CAS实现是由三个操作数来完成的, 1:读取的变量值 M 2:旧的预期值A 3:新的修改值B (以下简称)
CAS更新条件: 当CAS进行修改操作的时候, 当且仅当M=A,才会把M修改为B,否则什么都不做。(这个可能需要理解CAS的实现步骤,如果不懂建议学习下CAS实现原理).
3 缺点:
鱼和熊掌不可兼得,因为提高了性能,所以安全性肯定有所下降,这就导致一个经典的ABA问题出现了.
4: ABA问题:
CAS修改数据的时候 M初始读取的时候是A值 ,准备修改的时候M=A 符合CAS的条件了.但是这个A值有可能 是特务, 它首先变成了敌人D,然后又变成了友军A. 你说这样它还算是好人吗? 肯定不算. 所以ABA问题就是(A变成B 然后又变成A) . 为了解决这个问题.可以采用加个version版本号来解决.
version版本号:当A每次变换身份的时候,version值+1. 这样M读取A的时候,把版本号也获取,如果A变成特务在变回友军,版本号就会不一致.这个时候就不能修改了. 完美解决特务.
二:悲观锁
1 介绍:
它是一个满满负能量的锁,别人每次使用它,它都会认为别人会修改数据,所以每次都会加锁,性能很低,适用于写比较多的场景
2 实现:
java中的synchronized这种独占锁,就是悲观锁
3 缺点:
悲观锁由于每次使用前都会加锁,就导致在该锁没有被释放之前,是没办法做其他事情的,性能会非常差,java在1.6版本后对 synchronized进行了优化,采用四种级别, (无锁,偏向锁,轻量级锁,重量级锁), 来一步一步的提高锁的级别.
三 两者的使用场景:
CAS适用于写比较少的情况下(多读场景,冲突一般较少),synchronized适用于写比较多的情况下(多写场景,冲突一般较多)
java中的锁---乐观锁与悲观锁的区别相关推荐
- mysql proxy 悲观锁_使用MySQL悲观锁解决电商扣库存并发问题
昨天有人提出想看悲观锁,所以今天我们就说一说如何抗悲观锁解决并发问题: 悲观锁介绍(百科): 悲观锁,正如其名,它指的是对数据被外界(包括本系统当前的其他事务,以及来自外部系统的事务处理)修改持保守态 ...
- Java中的string定义的两种方法和区别
java中的String定义的两种方法和区别 第一种:new方式 String s1 = new String("hello world"); String s2 = new St ...
- java getabsolutepath,详谈java中File类getPath()、getAbsolutePath()、getCanonical的区别
简单看一下描述,例子最重要. 1.getPath(): 返回定义时的路径,(就是你写什么路径,他就返回什么路径) 返回绝对路径,但不会处理"."和".."的情况 ...
- java中的path类_详谈java中File类getPath()、getAbsolutePath()、getCanonical的区别
简单看一下描述,例子最重要. 1.getPath(): 返回定义时的路径,(就是你写什么路径,他就返回什么路径) 2.getAbsolutePath(): 返回绝对路径,但不会处理".&qu ...
- java中static、final 和 static final之间的区别
java中static.final 和 static final之间的区别 static可以修饰:全局属性,方法,代码块,内部类(静态内部类或嵌套内部类) 由于静态属性和方法是属于该类的所有对象的,所 ...
- java 里面write,java 中 System.out.println()和System.out.write()的区别
java 中 System.out.println()和System.out.write()的区别. 这两个函数一个是System.out.write()输出字符流,System.out.printl ...
- Java:中的String,StringBuilder,StringBuffer三者的区别
Java中的String,StringBuilder,StringBuffer三者的区别 最近在学习Java的时候,遇到了这样一个问题,就是String,StringBuilder以及StringBu ...
- 乐观锁和悲观锁_什么是悲观锁和乐观锁?
思维导图 文章已收录Github精选,欢迎Star:https://github.com/yehongzhi/learningSummary 悲观锁 悲观锁是平时开发中经常用到的一种锁,比如Reent ...
- 多线程与高并发基础一(超发--多线程悲观锁,乐观锁、类数据库悲观锁乐观锁)
PS:看完文章后对自己以前所做过的并发和锁机制有了深入原理的了解. 知其然和知其所以然! 遂以记之! 关键词: 线程,同步,单例,高并发,高访问,死锁 一.大规模并发带来的挑战 在过去的工作中,我曾经 ...
- 什么是乐观锁,什么是悲观锁?
在互联网公司面试中,很多小伙伴都被问到关于锁的理解.今天,我给小伙伴们来聊一聊我对锁的理解,不管我们互斥锁.自旋锁.重入锁.读写锁.行锁.表锁等等等等这些概念,我把他们都归纳为两种类型,乐观锁和悲观锁 ...
最新文章
- 如何轻松搞定机构资格准入?
- 区块链技术入门,都涉及哪些编程语言?
- python如何安装matplotlib_详解python安装matplotlib库三种失败情况
- rcmd: socket: Permission denied
- 【Python】 文件和操作文件方法
- linux分辨率和用户有关吗,Linux系统在高分屏非正常分辨率显示
- 20180209-shutil模块
- 冈萨雷斯《数字图像处理》读书笔记(三)——空间滤波
- 现代软件工程讲义 2 开发技术 - 效能分析
- JupyterHub on Kubernetes-Helm安装
- SQL SERVER 高级数据库脚本编程
- 中对曲线进行斜率提取_Au中的EQ处理方法——图形均衡器和参数均衡器
- 浅析vue2.0的diff算法
- python 操作符 vs java 操作符
- jquery设置video的宽度_使用jQuery和CSS自定义HTML5 Video 控件 简单适用
- java_js_json_日期格式化
- androidpn的学习研究(五)androidpn-client 常见BUG解决方法
- 【U盘量产】你的U盘坏了吗
- 用Python编写程序,写一个通信录。
- 郭天祥的10天学会51单片机_第八节
热门文章
- 大数据架构详解学习笔记
- Plant Simulation——笔记1(Unknown identifier ‘TrackDefine‘)
- MFC如何隐藏RibbonBar的QAT QuickAccessToolBar(快速访问工具栏)
- vue仿京东放大镜加商品缩略图轮播组件
- 基于SSM+MYSQL+Vue的宾馆管理系统
- 2012级网络工程1班程序设计学习主页
- 配置使用P6(EPPM) 定时服务(Job Services)
- 酷狗音乐获取hush值方法
- 如何自动发送短信给女朋友
- Android 修改Preferences样式