# 悲观锁、乐观锁
# 通俗理解
- 悲观锁:假设每次修改目标数据时,其它线程也要修改,修改之前,加锁,防止其他线程进入,修改之后再解锁
- 乐观锁:假设每次修改目标数据时,其他线程都不修改,修改时再判断数据是否被其他线程修改过
# 适用场景
- 悲观锁、乐观锁没有优劣之分,都是极其成熟的思想
- 悲观锁常常用于写场合较多的地方,乐观锁常常用于读场合较多的地方
# CAS (Compare-And-Sweep)
# 基本概念
CAS有3个操作数,内存值V,旧的预期值A,要修改的新值B。当且仅当预期值A和内存值V相同时,将内存值V修改为B,否则什么都不做
# ABA问题
例如,我在修改之前,读取的值为1,而其他人在我写入时,已经将1改为2,又将2改为了1,对于我来说,1是没有变的,而实际上已经变了。这就是ABA问题
想解决这个问题,就需要加一个版本的概念,类似于git或svn,一样的代码,但是版本号不一样,这样就容易区分了
# 不易长时间自旋
自旋这个操作虽然效率高,但是不停的比较和判断是很消耗CPU资源的,N多线程如果都按自旋方式来更新数据,那么CPU是吃不消的
所以如果是轻量级的线程竞争,竞争时间较短,推荐使用自旋方式