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资源,降低吞吐量;