CAS就是compareandset,是一种乐观锁的实现方式,他主要包括三个操作数,内存值,旧值和预期值,通过旧值和内存值做一个比对,如果相等就修改为新值,这几个操作是原子性的,通过调用本地接口然后最终使用cmpxchg指令来完成
    CAS的缺点:
    CAS自旋消耗比较大,所以CAS不适合写并发操作多的场景
    CAS有ABA问题,内存值可能中间被其他线程修改过(加版本号,时间戳解决)
    CAS只能保证一个共享变量的原子操作(把多个共享变量封装成对象即可)
    Java从1.5开始JDK提供了AtomicReference类来保证引用对象之间的原子性,可以把多个变量放在一个对象里来进行CAS操作。

    自旋是自适应的,之前是默认十次,由前一次在同一个锁上的自旋时间及锁的拥有者的状态来决定,如果这把锁刚刚才成功被获取过而且持有锁的线程还在执行,那么虚拟机认为这次也很有可能获取到锁,那么自旋的时间就长一点,如果很少获取到过这个对象的锁,那么可能就会直接阻塞掉