1.悲观锁
意思就是只能一个人操作,当前操作完了才能给别人操作(共享资源每次只给一个线程使用,其它线程阻塞,用完后再把资源转让给其它线程)
2.乐观锁
乐观锁是一种不锁记录的实现方式,采用CAS模式,采用version字段来作为判断依据。每次对数据的更新操作,都会对version+1,这样提交更新操作时,如version的值已被更改,说明这期间有人 操作过,则更新失败。
ABA问题:如果一个变量V初次读取的时候是A值,并且在准备赋值的时候检查到它仍然是A值,那我们就能说明它的值没有被其他线程修改过了吗?很明显是不能的,因为在这段时间它的值可能被改为其他值,然后又改回A,那就会误认为它从来没有被修改过。这个问题被称为"ABA"问题
3.如何选择
在乐观锁与悲观锁的选择上面,主要看下两者的区别以及适用场景就可以了。
1,响应效率:如果需要非常高的响应速度,建议采用乐观锁方案,成功就执行,不成功就失败,不需要等待其他并发去释放锁。乐观锁并未真正加锁,效率高。一旦锁的粒度掌握不好,更新失败的概率就会比较高,容易发生业务失败。
2,冲突频率:如果冲突频率非常高,建议采用悲观锁,保证成功率。冲突频率大,选择乐观锁会需要多次重试才能成功,代价比较大。
3,重试代价:如果重试代价大,建议采用悲观锁。悲观锁依赖数据库锁,效率低。更新失败的概率比较低。