# 悲观锁、乐观锁

# 通俗理解

  1. 悲观锁:假设每次修改目标数据时,其它线程也要修改,修改之前,加锁,防止其他线程进入,修改之后再解锁
  2. 乐观锁:假设每次修改目标数据时,其他线程都不修改,修改时再判断数据是否被其他线程修改过

# 适用场景

  1. 悲观锁、乐观锁没有优劣之分,都是极其成熟的思想
  2. 悲观锁常常用于场合较多的地方,乐观锁常常用于场合较多的地方

# 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是吃不消的

所以如果是轻量级的线程竞争,竞争时间较短,推荐使用自旋方式