锁,是开发中不得不掌握的一个知识点. 在面试中也会经常问到.其中乐观锁与悲观锁为最常见.首先介绍下两种锁

一:乐观锁:

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中的锁---乐观锁与悲观锁的区别相关推荐

  1. mysql proxy 悲观锁_使用MySQL悲观锁解决电商扣库存并发问题

    昨天有人提出想看悲观锁,所以今天我们就说一说如何抗悲观锁解决并发问题: 悲观锁介绍(百科): 悲观锁,正如其名,它指的是对数据被外界(包括本系统当前的其他事务,以及来自外部系统的事务处理)修改持保守态 ...

  2. Java中的string定义的两种方法和区别

    java中的String定义的两种方法和区别 第一种:new方式 String s1 = new String("hello world"); String s2 = new St ...

  3. java getabsolutepath,详谈java中File类getPath()、getAbsolutePath()、getCanonical的区别

    简单看一下描述,例子最重要. 1.getPath(): 返回定义时的路径,(就是你写什么路径,他就返回什么路径) 返回绝对路径,但不会处理"."和".."的情况 ...

  4. java中的path类_详谈java中File类getPath()、getAbsolutePath()、getCanonical的区别

    简单看一下描述,例子最重要. 1.getPath(): 返回定义时的路径,(就是你写什么路径,他就返回什么路径) 2.getAbsolutePath(): 返回绝对路径,但不会处理".&qu ...

  5. java中static、final 和 static final之间的区别

    java中static.final 和 static final之间的区别 static可以修饰:全局属性,方法,代码块,内部类(静态内部类或嵌套内部类) 由于静态属性和方法是属于该类的所有对象的,所 ...

  6. java 里面write,java 中 System.out.println()和System.out.write()的区别

    java 中 System.out.println()和System.out.write()的区别. 这两个函数一个是System.out.write()输出字符流,System.out.printl ...

  7. Java:中的String,StringBuilder,StringBuffer三者的区别

    Java中的String,StringBuilder,StringBuffer三者的区别 最近在学习Java的时候,遇到了这样一个问题,就是String,StringBuilder以及StringBu ...

  8. 乐观锁和悲观锁_什么是悲观锁和乐观锁?

    思维导图 文章已收录Github精选,欢迎Star:https://github.com/yehongzhi/learningSummary 悲观锁 悲观锁是平时开发中经常用到的一种锁,比如Reent ...

  9. 多线程与高并发基础一(超发--多线程悲观锁,乐观锁、类数据库悲观锁乐观锁)

    PS:看完文章后对自己以前所做过的并发和锁机制有了深入原理的了解. 知其然和知其所以然! 遂以记之! 关键词: 线程,同步,单例,高并发,高访问,死锁 一.大规模并发带来的挑战 在过去的工作中,我曾经 ...

  10. 什么是乐观锁,什么是悲观锁?

    在互联网公司面试中,很多小伙伴都被问到关于锁的理解.今天,我给小伙伴们来聊一聊我对锁的理解,不管我们互斥锁.自旋锁.重入锁.读写锁.行锁.表锁等等等等这些概念,我把他们都归纳为两种类型,乐观锁和悲观锁 ...

最新文章

  1. 如何轻松搞定机构资格准入?
  2. 区块链技术入门,都涉及哪些编程语言?
  3. python如何安装matplotlib_详解python安装matplotlib库三种失败情况
  4. rcmd: socket: Permission denied
  5. 【Python】 文件和操作文件方法
  6. linux分辨率和用户有关吗,Linux系统在高分屏非正常分辨率显示
  7. 20180209-shutil模块
  8. 冈萨雷斯《数字图像处理》读书笔记(三)——空间滤波
  9. 现代软件工程讲义 2 开发技术 - 效能分析
  10. JupyterHub on Kubernetes-Helm安装
  11. SQL SERVER 高级数据库脚本编程
  12. 中对曲线进行斜率提取_Au中的EQ处理方法——图形均衡器和参数均衡器
  13. 浅析vue2.0的diff算法
  14. python 操作符 vs java 操作符
  15. jquery设置video的宽度_使用jQuery和CSS自定义HTML5 Video 控件 简单适用
  16. java_js_json_日期格式化
  17. androidpn的学习研究(五)androidpn-client 常见BUG解决方法
  18. 【U盘量产】你的U盘坏了吗
  19. 用Python编写程序,写一个通信录。
  20. 郭天祥的10天学会51单片机_第八节

热门文章

  1. 大数据架构详解学习笔记
  2. Plant Simulation——笔记1(Unknown identifier ‘TrackDefine‘)
  3. MFC如何隐藏RibbonBar的QAT QuickAccessToolBar(快速访问工具栏)
  4. vue仿京东放大镜加商品缩略图轮播组件
  5. 基于SSM+MYSQL+Vue的宾馆管理系统
  6. 2012级网络工程1班程序设计学习主页
  7. 配置使用P6(EPPM) 定时服务(Job Services)
  8. 酷狗音乐获取hush值方法
  9. 如何自动发送短信给女朋友
  10. Android 修改Preferences样式