乐观锁是基于假设每次拿数据的时候别人都不会修改,而悲观锁则正好相反。

所以悲观锁在每次拿数据的时候都会上锁,这样其他线程就拿不到这个数据。而乐观锁则是每次拿数据认为其他线程不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间有没有其他线程去更新这个数据。

适用场景乐观锁适用于多读场景,悲观锁适用于多写场景

实现方式乐观锁可以用版本号机制或者CAS算法实现

CAS操作逻辑:如果内存位置的值等于预期的值,那么就将该位置更新为新的值,否则不用进行任何操作,如果操作不成功,就会一直重试,直到成功。

版本号机制:这个的操作逻辑是在数据中增加一个叫版本号的性质,每次数据被修改,版本号加一。查询数据的时候,版本还也会被一起查出来。如果修改该数据,再写回的时候,检查当前的版本号与之前读取的版本号是否一致,如果一致才操作。

乐观锁本身是不加锁的,只是在更新的时候判断一下数据是否被其他线程更新了。

CAS的缺点:不太好解决ABA问题。此外 咋并发冲突比较大的情况下,CAS失败了会一直重试,会造成很大的开销。

In one word, passive lock locks the data each time one thread wants to get it. but optimistic locker don’t lock the whole data.