悲观锁和乐观锁并不是某个具体的“锁”而是一种并发编程的基本概念,是根据看待并发同步的角度;
成都创新互联-成都网站建设公司,专注网站设计制作、网站设计、网站营销推广,域名注册,虚拟主机,网站托管维护有关企业网站制作方案、改版、费用等问题,请联系成都创新互联。
悲观锁和乐观锁是用来解决并发问题的两种思想,在不同的平台有着各自的实现。
废话不多,开始讲解
乐观锁一般会使用版本号机制或 CAS 算法实现
数据表中加上一个数据版本号 version 字段,表示数据被修改的次数。当数据被修改时,version 值会加一。当线程 A 要更新数据值时,在读取数据的同时也会读取 version 值,在提交更新时,若刚才读取到的 version 值为当前数据库中的 version 值相等时才更新,否则重试更新操作,直到更新成功
CAS 的思想很简单,就是用一个预期值和要更新的变量值进行比较,两值相等才会进行更新;
CAS 是一个原子操作,底层依赖于一条 CPU 的原子指令
CAS 涉及到三个操作数:
当且仅当 V 的值等于 E 时,CAS 通过原子方式用新值 N 来更新 V 的值。如果不等,说明已经有其它线程更新了V,则当前线程放弃更新;
CAS 经常会用到自旋操作来进行重试,也就是不成功就一直循环执行直到成功。如果长时间不成功,会给 CPU 带来非常大的执行开
CAS 只对单个共享变量有效,当操作涉及跨多个共享变量时 CAS 无效。但是从 JDK 1.5 开始,提供了AtomicReference类来保证引用对象之间的原子性,你可以把多个变量放在一个对象里来进行 CAS 操作.所以我们可以使用锁或者利用AtomicReference类把多个共享变量合并成一个共享变量来操作
分享题目:面试必备之乐观锁与悲观锁
文章来源:http://www.shufengxianlan.com/qtweb/news42/1892.html
网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联