CAS (Compare And Swap)

    1. synchronized关键字与Lock等锁机制都是悲观锁:无论做何种操作,首先都需要先上锁,接下来再去执行后续操作,从而确保了接下来的所有操作都是由当前这个线程来执行的。
    2. 乐观锁:线程在操作之前不会做任何预先的处理,而是直接去执行;当在最后执行变量更新的时候,当前线程需要有一种机制来确保当前被操作的变量是没有被其他线程修改的; 每次不加锁而是假设没有冲突而去完成某项操作,如果因为冲突失败就重试,直到成功为止。CAS是乐观锁的一种极为重要的实现方式。

    比较与交换:这是一个不断循环的过程,一直到变量值被修改成功为止。CAS本身是由硬件指令来提供支持的,换句话说,硬件中是通过一个原子指令来实现比较与交换的;因此,CAS可以确保变量操作的原子性的。

    UnSafe类
    UnSafe类是CAS的核心类,由于Java无法直接访问底层系统,所以要通过本地的native方法进行访问,UnSafe类就相当于一个后门,基于该类可以直接操作特定内存中的数据,其内部就像C的指针一样操作内存。观察UnSafe类的源码,可以看到UnSafe类都是native方法,也就是说Unsafe类都是直接调用操作系统底层资源执行任务。

    对于CAS来说,其操作数主要涉及到如下三个:

    1. 需要被操作的内存值V
    2. 需要进行比较的值A
    3. 需要进行写入的值B
      只有当V==A的时候,CAS才会通过原子操作的手段来将V的值更新为B。

    关于CAS的限制或是问题

    1. 循环开销问题:并发量大的情况下会导致线程一直自旋
    2. 只能保证一个变量的原子操作:可以通过AtomicReference来实现对多个变量的原子操作
    3. ABA问题:1 -> 3 -> 1。AtomicMarkableReference,AtomicStampedReference