CAS机制
2021-05-17 本文已影响0人
垂直居中的句号
悲观锁: 假定会发生并发冲突,屏蔽一切可能违反数据完整性的操作。依靠底层提供的锁机制,会导致其他所有需要锁的线程都挂起。
synchronized独占锁 ,是一种悲观锁。
乐观锁:每次都不加锁而是假定没有冲突去完成某项工作,如果冲突会一直重试直到成功。
乐观锁会导致脏读
(脏读就是读取未提交的内容,事务A读到事务B未提交的内容,而事务B因为冲突执行失败回滚。事务A读到了B无效的修改;不可重复读:就是前后多次读,内容不一致;幻读:就是前后多次读,总数不一样)
乐观锁会基于数据库版本记录实现,事务A读取数据时也读到版本号,修改后写入的时候,会比较版本号,如果数据库版本号比事务A的大,则说明有其他事务修改了,视为过期数据,否则修改。
CAS锁机制就是 乐观锁
三个操作数 V内存位置的值,预计期望值A,更新值B
比较V与A是否相等
相等则更新为B
返回操作成功
ABA问题
就是事务A预先获取了值为1,这是A阻塞,事务B修改成2后,事务C修改成1,此时事务A又比较值是对的,但实际上已经修改了,银行取钱问题。
引入版本号比较,可解决ABA问题。
volatile 保证了共享变量的可见性,不保证原子性。