CAS

题目来源: PingCap

答案:

  1. 乐观锁
    乐观锁的概念其实很简单,就是在操作一个共享变量时,我们先认为多个线程之间没有冲突
  2. CAS
    CAS是乐观锁的一种实现,CAS全称是比较和替换,CAS的操作主要由以下几个步骤组成:
    1.先查询原始值
    2.操作时比较原始值是否修改
    3.如果修改,则操作失败,禁止更新操作,如果没有发生修改,则更新为新值
  3. CAS的缺点
    CAS虽然在低并发量的情况下可以减少系统的开销,但是CAS也有一些问题:
    1.CPU开销过大问题
    2.ABA问题
    3.只能针对一个共享变量
  4. CPU开销过大
    在我们使用CAS时,如果并发量过大,我们的程序有可能会一直自旋,长时间占用CPU资源。
  5. ABA问题
    假设有个共享变量J,原始值为1。
    1.线程A读取变量J,值为1
    2.线程B读取变量J,值为1
    3.线程A变量J+1,CAS成功从1修改为2
    4.线程C读取变量J,值为2
    5.线程C将变量J-1,CAS成功从2修改为1
    6.线程A通过CAS比较和替换,依然可以改为自己想修改的值
    上述过程,线程B和C已经将变量J的值已经改变了,但是线程A无法发现,依然可以修改共享变量,这就产生了ABA问题。
  6. 共享变量单一
    CAS操作单个共享变量的时候可以保证原子的操作,无法操作多个变量。
    但是在JDK5之后,AtomicReference可以用来保证对象之间的原子性,我们可以把多个对象放入CAS中操作。
  7. 如何防止CAS的ABA
    四个字:加标志位(version)。
    至于标志位可以是自增的数字,也可以是时间戳。通过标志位我们可以精确的知道每次修改。