CAS (无锁优化 自旋)

Compare And Swap(都是基于Unsafe类完成)
    jdk8是 CompareAndSwap  jdk11变成了weakCompareAndSet
    Atomic相关的类都是利用了cas自旋来实现的无锁的线程安全的类.
    cas本身是无锁的
    cas(v,e,n)
    if v==e;
       v=n
    v:原来的值,e:期望当前的这个值是多少,n:要设定的新值
    判断原来的值是否等于当前期望的这个值
    如果相等 则修改这个值   不相等就相当于被别的线程修改了,我就调自己在试一次
    在调cas这个操作时,是无法被打断的,是cpu原语支持的,所以在执行cas的代码指令时,不会发生多线程并发问题
ABA问题
    Atomic原子类中有用时间戳的类来判断修改的值是否发生的ABA的问题(AtomicStampedReference方法)
    如果是基础类,无所谓,如果是引用类型则会引发类似下面的问题
    aba问题-->你和你女朋友复合之前,你的女朋友在这中间不知道又经历了多少个男人,虽然最后还是你女朋友
     -------->但是你女朋友在这个中间可能发生了一些未知的事,可能导致后续结果不一致(表面是一样的,心已经变了,已经不是你原来的那个女朋友了)

Unsafe类 = c,c++的指针(可直接操作内存)但是好像已经无法使用了

文档更新时间: 2020-11-05 10:03   作者:mlrs