13518219792

建站动态

根据您的个性需求进行定制 先人一步 抢占小程序红利时代

面试必备之乐观锁与悲观锁

悲观锁和乐观锁并不是某个具体的“锁”而是一种并发编程的基本概念,是根据看待并发同步的角度;

成都创新互联-成都网站建设公司,专注网站设计制作、网站设计、网站营销推广,域名注册虚拟主机,网站托管维护有关企业网站制作方案、改版、费用等问题,请联系成都创新互联

悲观锁和乐观锁是用来解决并发问题的两种思想,在不同的平台有着各自的实现。

废话不多,开始讲解

1、悲观锁

2、乐观锁

3、实现乐观锁算法

乐观锁一般会使用版本号机制或 CAS 算法实现

①版本号机制

数据表中加上一个数据版本号 version 字段,表示数据被修改的次数。当数据被修改时,version 值会加一。当线程 A 要更新数据值时,在读取数据的同时也会读取 version 值,在提交更新时,若刚才读取到的 version 值为当前数据库中的 version 值相等时才更新,否则重试更新操作,直到更新成功

②CAS 算法

CAS 的思想很简单,就是用一个预期值和要更新的变量值进行比较,两值相等才会进行更新;

CAS 是一个原子操作,底层依赖于一条 CPU 的原子指令

CAS 涉及到三个操作数:

当且仅当 V 的值等于 E 时,CAS 通过原子方式用新值 N 来更新 V 的值。如果不等,说明已经有其它线程更新了V,则当前线程放弃更新;

4、乐观锁问题

①ABA 问题

②循环时间长开销大

CAS 经常会用到自旋操作来进行重试,也就是不成功就一直循环执行直到成功。如果长时间不成功,会给 CPU 带来非常大的执行开

③只能保证一个共享变量的原子操作

CAS 只对单个共享变量有效,当操作涉及跨多个共享变量时 CAS 无效。但是从 JDK 1.5 开始,提供了AtomicReference类来保证引用对象之间的原子性,你可以把多个变量放在一个对象里来进行 CAS 操作.所以我们可以使用锁或者利用AtomicReference类把多个共享变量合并成一个共享变量来操作


网页题目:面试必备之乐观锁与悲观锁
分享链接:http://cdbrznjsb.com/article/dppjshi.html

其他资讯

让你的专属顾问为你服务