乐观锁与悲观锁

1.悲观锁:

悲观锁是一种比较悲观的思想,认为每次操作都会修改变量的值,因此每次对变量就行操作都会进行加锁;

数据库中的行锁,表锁,读锁,写锁都是悲观锁的实现;

java中的syschronized关键字也是悲观锁的实现;

2.乐观锁:

乐观锁就是一种比较乐观的思想,认为每次操作都不会进行修改变量,所以每次操作都不会进行上锁;

但是在每次进行更新操作的时候会判断在此期间是否修改变量的值,常用的实现方式的cas操作;

java中的juc包下的automic包下的类都是采用CAS操作实现乐观锁;

3.CAS操作:

(1)CAS操作过程:首先需要进行读写操作的变量的内存位置V,然后需要变量的预期的原始值A,和进行修改操作的拟写入新值B;

若变量的预期原始值A与变量的内存位置相匹配,则将拟写入新值B赋给该变量,否则进行循环获取最新的预期原始值A;

在多个线程并发进行修改操作的时候,只有一个线程会获得执行,其他线程并不会被阻塞,而是会被通知获取执行失败;

(2)CAS操作的缺点:

首先就是CAS操作存在ABA问题;

其此是CAS操作只能对一个变量进行操作;

CAS操作会占用CPU资源,降低吞吐量;

详细内容参考:https://www.cnblogs.com/qjjazry/p/6581568.html

原文地址:https://www.cnblogs.com/xuzhiyuan/p/9272711.html