乐观锁
1、版本号机制
数据库的MVCC机制就是这种,MVCC更加严格一点,后边增加了创建版本及删除版本两个字段。
详情参考:
https://blog.csdn.net/numbbe/article/details/109300087
版本号机制也是CAS操作的一种,先比较再替换。
比如我有一个学生表,有两个字段,饭卡余额和版本,初始化为,饭卡余额为100,版本为1。
1、线程A吃饭刷了20块钱,修改余额为80,首先进行读操作,记录学生此时余额为100,版本号为1。
2、线程B吃饭刷了40块钱,修改余额为60,首先进行读操作,记录学生此时余额为100,版本号为1。
3、线程A要提交了,提交的版本为1+1=2,再次读,看一下最新的数据,提交版本>当前版本1,可以提交,提交成功。
4、线程B要提交了,提交的版本为1+1=2,再次读,看一下最新的数据,提交版本为2,当前版本为2,不满足【提交版本>当前版本】前提条件,提交失败。
(这里直接比对版本号,也可以,如果版本号和自己记录的版本号不一致,说明有人动过了,就不提交)
(这两种比较方式,都是判断一下有没有其他线程对数据进行了更改)
(百度了很多文章,有说比对版本号是否相等的,有说判断版本大小的,到底怎么回事,咱也不知道)
线程A与线程B是有先后顺序的,线程A更新执行后,线程B再执行, 这个时候线程B应该使用最新的数据,而不是使用版本1的旧数据。
你要提交的数据,版本号是要大于当前版本的。如果小于等于当前最新版本,说明已经有其他线程修改过了。
2、CAS操作
简而言之,读读写。
第一次读,记录数据。
第二次读,比对数据。
开始写。
compare and swap,无锁算法,非阻塞式同步。
CAS算法涉及三个操作数。
- 旧值 V
- 比较值 A
- 新值 B
当且仅当A与V相等时,CAS通过原子方式用新值B更新V。
悲观锁
我们最经常使用的锁,比如下边这两个都是悲观锁,悲观锁加锁,乐观锁不加锁。
1、synchronized
参考:
https://blog.csdn.net/numbbe/article/details/113178567
2、lock
参考: