(1)乐观锁和悲观锁概念介绍

介绍乐观锁和悲观锁,可以先理解一下,乐观、悲观两个概念。

  • 乐观锁对应于生活中乐观的人总是想着事情往好的方向发展。
  • 悲观锁对应于生活中悲观的人总是想着事情往坏的方向发展。

乐观锁和悲观锁是两种思想,不局限在某种编程语言或者数据库。

乐观锁概念

乐观锁在操作数据的时候,非常乐观,都认为别人不会同时修改数据,所以乐观锁在更新数据之前,都不会对数据进行加锁,只有当执行更新数据操作时候,再去判断数据是否被修改,如果数据被修改了,就放弃被当前修改操作。

悲观锁概念

悲观锁在操作数据时候,比较悲观,都认为别人会和自己同时修改数据,所以悲观锁操作数据时候,会直接给数据上锁,不让别人操作,只有自己操作完成后,才释放锁。

(2)乐观锁和悲观锁使用场景

乐观锁使用场景

乐观锁适用于读多写少的情况下,即:读数据多余写数据的时候,可以考虑使用乐观锁。

注意:乐观锁本身是不加锁的,只是会在更新数据时候判断数据是否变化。

悲观锁使用场景

悲观锁适用于写多读少的情况下,即:需要频繁的写数据时候,可以考虑使用悲观锁。

(3)乐观锁和悲观锁实现方式

乐观锁实现方式

  • 乐观锁有两种实现方式:
  • CAS机制
  • 版本号机制

《1》CAS机制

CAS有三个操作数:

 1) 需要读写的内存位置(V)2) 进行比较的预期值(A)3) 拟写入的新值(B)
  • 如果内存位置V的值等于预期的A值,则将该位置更新为新值B,否则不进行任何操作。
  • 许多的CAS是自旋的,也就说如果一次不成功,它会一直循环去判断,直到成功为止。

自旋CAS就会占用系统资源,比较耗费CPU的开销。

CAS会导致ABA问题。

ABA问题是指:

线程1修改数据后值等于A,线程2修改数据后值变成B,线程2再次修改数据后值变成A,这样,CAS检查时候,发现修改前后的值是一样的,就认为没有修改,所以CAS操作成功。

《2》版本号机制

版本号机制,是在数据库中添加一个version字段,用于标识哪个版本。每当修改一次数据时候,会将版本号加1。

  • 当查询数据时候,将数据中的版本号一起查询出来。
  • 接着修改数据,准备提交更新后的数据到数据库时候,再次查询数据库中版本号。
  • 判断当前查询的版本号是否和第一次查询的一样,如果一样,则进行操作,否则重试。

悲观锁实现方式

  • 悲观锁实现,就是通过加锁。
  • 可以对代码块加锁,也可以对数据加锁。
  • Java中可以使用synchronized同步代码块。
  • 数据库中可以使用排它锁。

面试题:乐观锁和悲观锁相关推荐

  1. Java面试题之:乐观锁、悲观锁与自旋锁及其相关锁的优化(万字知识点详解)

    Java面试题之:乐观锁.悲观锁与自旋锁及其锁的优化 一.乐观锁 二.悲观锁 三.自旋锁 ①自旋锁的优缺点 ②自旋锁时间阈值(1.6 引入了适应性自旋锁) ③自旋锁的开启 四.Synchronized ...

  2. Java多线程学习总结(5)——乐观锁和悲观锁的基本概念、实现方式(含实例)、适用场景及常见面试题

     分享一个大神的人工智能教程.零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到人工智能的队伍中来!点击浏览教程 一.基本概念 乐观锁和悲观锁是两种思想,用于解决并发场景下的数据竞争问题. 乐观锁 ...

  3. 面试题之——乐观锁和悲观锁区别

    对于乐观锁和悲观锁的区别及应用,要牢记一句话:读取频繁使用乐观锁,写入频繁使用悲观锁 本文转自:https://blog.csdn.net/L_BestCoder/article/details/79 ...

  4. Java并发问题--乐观锁与悲观锁以及乐观锁的一种实现方式-CAS

    Java并发问题–乐观锁与悲观锁以及乐观锁的一种实现方式-CAS </h1><div class="clear"></div><div c ...

  5. Juc07_乐观锁和悲观锁、公平锁和非公平锁、递归锁(可重入锁)、死锁及排查、自旋锁

    文章目录 ①. 乐观锁和悲观锁 ②. 公平锁和非公平锁 ③. 可重入锁(又名递归锁) ④. 死锁及排查 ⑥. 自旋锁 ①. 乐观锁和悲观锁 ①. 悲观锁(synchronized关键字和Lock的实现 ...

  6. MySQL数据库的锁(什么是数据库的锁?什么是乐观锁和悲观锁?什么是死锁?如何避免?)

    数据库的锁 什么是数据库的锁? 数据库的锁与隔离级别的关系? 数据库锁的类型有哪些? MySQL中InnoDB引擎的行锁模式及其是如何实现的? 什么是数据库的乐观锁和悲观锁,如何实现? 什么是死锁?如 ...

  7. 字节二面 —— 什么是同步锁、死锁、乐观锁、悲观锁

    马上就要到金三银四佳季了,是找工作的好时候,小伙伴们一定要把握好时机,找到心仪的高薪工作.找工作就少不了面试,那我们从现在开始,多刷刷面试题,查缺补漏!!! 目录 1. 面向对象的特征 2. Java ...

  8. [初级]深入理解乐观锁与悲观锁

    2019独角兽企业重金招聘Python工程师标准>>> 在数据库的锁机制中介绍过,数据库管理系统(DBMS)中的并发控制的任务是确保在多个事务同时存取数据库中同一数据时不破坏事务的隔 ...

  9. 乐观锁与悲观锁——解决并发问题

    引言   在多用户环境中,在同一时间可能会有多个用户更新相同的记录,这会产生冲突.这就是著名的并发性问题. 典型的冲突有: 丢失更新:一个事务的更新覆盖了其它事务的更新结果,就是所谓的更新丢失.例如: ...

最新文章

  1. gabor小波matlab,用matlab实现gabor小波对图片的纹理特征提取【转】
  2. log4jdbc mysql jdbc_spring boot 集成log4jdbc 查看完整sql
  3. 播放器03:以文件夹的形式添加整个文件夹里面的文件到播放列表,播放刚加进来的第一首歌曲,默认顺序播放...
  4. DL之CNN:计算机视觉之卷积神经网络经典算法简介、重要进展、改进技巧之详细攻略(建议收藏)
  5. 从零开始一步一步搭建Ubuntu Server服务器、修改数据源、安装Docker、配置镜像加速器、Compose部署Gitlab服务
  6. jquery实现滚动条滚动到一定高度导航固定不变
  7. 排队问题解题思路_1120各数的认识解决问题
  8. Andorid 刷新样式一
  9. dalvik虚拟机执行流程_程序员必备的一些流程图
  10. flume 写入文件服务器,Flume环境配置以及基本操作
  11. 转贴:Google提供网站恶意软件侦测服务
  12. CentOS - thin web server for Ruby(centos下安装thin,运行rails)
  13. 程序员必看!java操作word表格
  14. python pycharm 无法import win32api、win32con、win32com、win32gui 问题一次解决!方法合集
  15. 深度学习——反向传播(Backpropagation)
  16. python类方法重写和重载的区别_python 重载和重写的区别
  17. linux qt 多点触摸,Qt 4.6 添加 Multi-touch(多点触摸)支持
  18. 尝遍裸辞各种苦,再也不敢任性裸辞了!
  19. 【无标题】如何做APP客户端数据埋点
  20. 智能空调雷达感应,雷达模组技术方案,毫米波雷达传感器应用

热门文章

  1. python+opencv调用手机摄像头
  2. oracle 怎么使用跟踪,Oracle 10046跟踪事件使用方法
  3. 50+企业合作入驻、1000+算法,钛灵AI算法市场的进阶之路
  4. Android 10.0 framework根据允许app启动白名单限制其他app启动
  5. FANUC机器人SYST-212报警PAUSE.G需要应用DCS参数的解决办法
  6. css多行文本超出显示省略号无效解决方法
  7. php织梦源码安装,dedecms织梦模板安装教程织梦源码安装方法
  8. linux 文件夹拷贝并覆盖
  9. springboot过滤器和拦截器
  10. Nginx配置Nacos反向代理