乐观锁和悲观锁的理解

悲观锁假设最坏的情况,即每次拿数据时都认为别人会修改,所以每次拿数据的时候都会上锁,这样别人拿着笔数据的时候就会阻塞,直到他拿到锁。关系型数据库里有这种锁表的机制, 都是在做操作之前先上锁。Java中synchronized和ReentrantLock等独占锁就是悲观锁思想的实现

乐观锁总是假设最好的情况,拿数据的时候不会上锁,但是在更新数据的时候会判断数据在此期间是不是更改了,比如使用版本号机制和CAS机制,适用于多读的场景,再多写的场景时反而会降低性能。

所以一般情况下乐观锁适用于多读少写的情况,而悲观锁适用于多写的情况。。

乐观锁常见的两种实现方式:

1:版本号机制,即在修改数据库时判断当前数据库的版本号是否与当前版本号一致,如果不一致则不进行修改,进行回滚,在修改当前数据时对当前数据进行判断是否未有变化,在没有变化的情况下才进行修改

2:CAS算法 即compare and swap(比较与交换),是一种有名的无锁算法。无锁编程,即不使用锁的情况下实现多线程之间的变量同步,也就是在没有线程被阻塞的情况下实现变量的同步,所以也叫非阻塞同步(Non-blocking Synchronization)。CAS算法涉及到三个操作数
1,需要读写的内存值V 即当前数据库中的值
2,进行比较的值A,是我对数据库进行操作时数据库里的值
3,拟写入的新值B,是我准备修改的值
在进行写入的时候进行比较和交换,如果V和A不一致,则不进行任何操作,一般情况下是一个自旋操作,即不断的重试。

悲观锁一般使用synchronized来进行,在进行多写的时候,悲观锁相较于CAS会更方便

synchronized的底层实现主要依靠 Lock-Free 的队列,基本思路是 自旋后阻塞,竞争切换后继续竞争锁,稍微牺牲了公平性,但获得了高吞吐量。在线程冲突较少的情况下,可以获得和CAS类似的性能;而线程冲突严重的情况下,性能远高于CAS。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值