本来昨天晚上只是参加了一下宣讲会,然后谁知道宣讲会直接就给卷子面试了···,面试了,当时我是惊呆的。但是,既然都来了,面试就面试吧。虽然没准备,但是这是该挨的虐,没办法。

  笔试完之后,总体感觉还是挺好的,虽然还没有收到下一轮的面试通知。但是题目都还挺简单,几个编程题都在LeetCode上刷过几遍,但是一些理论的题答得并不是太好,其中就是这个悲观锁和乐观锁。下面我就讲下悲观锁和乐观锁。


一、乐观锁

  1. 原理
       总是认为不会产生并发问题,每次去取数据的时候总认为不会有其他线程对数据进行修改,因此不会上锁,但是在更新时会判断其他线程在这之前有没有对数据进行修改,一般会使用版本号机制或CAS操作实现。
  2. 实现
  • Version方式
       一般是在数据表中加上一个数据版本号version字段,表示数据被修改的次数,当数据被修改时,version值会加一。当线程A要更新数据值时,在读取数据的同时也会读取version值,在提交更新时,若刚才读取到的version值为当前数据库中的version值相等时才更新,否则重试更新操作,直到更新成功。

核心代码:

update table set x=x+1, version=version+1 where id=#{id} and version=#{version};
  • CAS方式
       即compare and swap 或者 compare and set,涉及到三个操作数,数据所在的内存值,预期值,新值。当需要更新时,判断当前内存值与之前取到的值是否相等,若相等,则用新值更新,若失败则重试,一般情况下是一个自旋操作,即不断的重试。

二、悲观锁

  1. 原理
       总是假设最坏的情况,每次取数据时都认为其他线程会去修改,所以都会加锁(读锁、写锁、行锁等),当其他线程想要访问数据时,都需要阻塞挂起等待。
  2. 实现
       可以依靠数据库实现,如行锁、读锁和写锁等,都是在操作之前加锁,在Java中,synchronized的思想也是悲观锁。

总结:


文章为DavidHan原创,如果文章有错的地方欢迎指正,大家互相交流。

乐观锁与悲观锁原理及实现相关推荐

  1. 详解各种锁:CAS、共享锁、排它锁、互斥锁、悲观锁、乐观锁、行级锁、表级锁、页级锁、死锁、JAVA对CAS的支持、ABA问题、AQS原理

    共享锁(S锁) 又称为读锁,可以查看但无法修改和删除的一种数据锁.如果事务T对数据A加上共享锁后,则其他事务只能对A再加共享锁,不能加排它锁.获准共享锁的事务只能读数据,不能修改数据. 共享锁下其它用 ...

  2. 最通俗易懂的乐观锁与悲观锁原理及实现

    转载自  最通俗易懂的乐观锁与悲观锁原理及实现 一.乐观锁 总是认为不会产生并发问题,每次去取数据的时候总认为不会有其他线程对数据进行修改,因此不会上锁,但是在更新时会判断其他线程在这之前有没有对数据 ...

  3. 一篇文章带你弄懂乐观锁与悲观锁,CAS原子性,synchronized底层原理

    文中加入了个人理解,如有不准确的地方欢迎提出,笔者会及时的进行改正. 乐观锁与悲观锁 乐观锁: 假设数据不会发生冲突,只有在进行数据更新的才会对数据进行检查,如果冲突则更新失败并返回错误信息 悲观锁: ...

  4. 乐观锁和悲观锁的底层实现原理

    本文参考--敖丙--JavaFamily 概述 上一篇文章我们提到了乐观锁和悲观锁的工作方式和使用场景,那么这两种锁本身是如何实现的? 这篇文章就来总结一下乐观锁和悲观锁,他们对应的实现-- CAS ...

  5. mysql 原理~ 乐观锁和悲观锁

    一 简介:今天咱们来聊聊悲观锁和乐观锁 二 悲观锁   1 定义    在关系数据库管理系统里,悲观并发控制(又名"悲观锁",Pessimistic Concurrency Con ...

  6. 乐观锁和悲观锁的原理及应用场景

    一.乐观锁和悲观锁的策略 1.悲观锁(一般都是通过锁机制来实现的) (1)每次去拿数据都会认为别人会修改,所以每次拿数据的时候都会上锁.比如:行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁.再比如 ...

  7. 乐观锁、悲观锁原理解析

    并发控制 当程序中可能出现并发的情况时,我们就需要通过一定的手段来保证在并发情况下数据的准确性,通过这种手段保证了当前用户和其他用户一起操作时,所得到的结果和他单独操作时的结果是一样的.这种手段就叫做 ...

  8. 乐观锁与悲观锁以及乐观锁的一种实现方式-CAS

    首先介绍一些乐观锁与悲观锁: 悲观锁:总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁.传统的关系型数据库里边就用到了很 ...

  9. mysql乐观和悲观锁实现_mysql实现乐观锁和悲观锁该怎么编写?

    乐观锁和悲观锁相信大家都是知道的,这是java中的基础知识,今天我们就来看看它们两者该如何使用代码实现吧. 乐观锁实现 1).表设计 表task,分别有三个字段id,value.version 2). ...

  10. 乐观锁与悲观锁及应用举例

      最近因为在工作中需要,学习了乐观锁与悲观锁的相关知识,这里我通过这篇文章,把我自己对这两个"锁家"兄弟理解记录下来;        - 悲观锁:正如其名,它指的是对数据被外界( ...

最新文章

  1. 强化学习(Reinforcement Learning)是什么?强化学习(Reinforcement Learning)和常规的监督学习以及无监督学习有哪些不同?
  2. php中的extract函数
  3. QT5 QT4--LNK2019 无法解析的外部符号
  4. 神经网络学习之----Hopfield神经网络(代码实现)
  5. 【转载】高效能,大数据量存储方案SqlBulkCopy
  6. C++中函数调用时的三种参数传递方式(x,*x,x)
  7. js基本包装类型和引用类型
  8. php mysql html标签_HTML标签格式化PHP和MySQL
  9. Google Chrome 1.0.154.46稳定版本发布 修复高危安全漏洞
  10. javascript 终极循环方法for... of ..推荐
  11. 信用卡-可恶的招商银行,可恶的循环利息
  12. Linux 命令(135)—— gpasswd 命令
  13. 获取Resources文件下图片的精灵格式
  14. 开源ext2read代码走读之-如何读取MBR分区的内容
  15. 哔哩哔哩如何提取封面_如何正确提取视频封面
  16. 计算机开机白屏怎么处理,电脑开机白屏怎么办如何解决开机白屏的问题
  17. 【历史杂谈】之《古代最美的谎言》
  18. web读取身份证信息(java语言)
  19. VBScript运行时错误处理
  20. 蓝牙配对码配置错误_漏洞问题频发,你还敢开你的蓝牙吗?

热门文章

  1. 快手电玩中“圈圈跑酷”玩法demo
  2. Linux-VIM中字符串的替换
  3. 华为 P20 Pro 屏幕素质报告
  4. 车载测试工具-CANoe
  5. opensuse 下搭建mysql apache_1.搭建LAMP开发环境的步骤(openSUSE Tumbleweed)
  6. 如何与员工正确的谈话:GROW法
  7. SSM的全部jar包免费百度云下载
  8. Element Table 表格 设置滚动条以及修改边框颜色
  9. Google Awareness(情景感知)
  10. 关于单片机控制用字库显示LCD12864汉字