• Compare And Swap
  • cas(V, Expected, NewValue)===>第一个参数为要修改的值,第二个参数为期望看到的值,第三个参数为新值
    • if V==E
    • V=New
    • otherwise try again or fail
  • 失败之后有可能再试一遍,也有可能就失败了
  • CPU原语支持===>是cpu原语指令层面的支持,中间不能被打断===>原子性

ABA问题通过加version解决(加标签)

  1. 每次操作都进行版本修改(加1),之后检查跟版本号一块检查

image.png

  1. Atomic中有带版本号的类(AtomicStampedReference)
    1. 加个时间戳!
    2. ABA在基本类型上没什么问题!在引用类型上就有问题
    3. 引用会有问题,不是引用问题不大


Atomic类—->CompareAndSet(Unsafe类)


Unsafe类(学的是1.7/8版本的,现在已经更新了11版本)

  • 直接操作内存=c/c++的指针
    • c -> malloc和free;c++ -> new和delete
    • allocateMemory putXX freeMemory pageSize
  • 直接生成类实例
    • allocatelnstance
  • 直接操作类或实例变量
    • objectFieldOffset
    • getInt
    • getObject
  • CAS相关操作
    • compareAndSwapObject Int Long
    • weakcompareAndSetObject Int Long===>弱指针、弱引用,方便垃圾回收,回收时效率比较高
  • 除了反射能直接使用之外其他不能直接使用(只能jdk的作者最底层的那群人才能拿来用);11版本中Unsafe可以直接拿来用了,不必通过反射再拿来用
  • 不能直接使用的原因与classloader有关
  • 该类是一个单例模式
  • Unsafe直接操纵jvm中的内存,直接通过内存操作对象(与new无关)
  • Unsafe让我们具备了c++那样写程序的能力

🌟不断的循环可以放在CAS中,可以放在CAS外面包住CAS,来不断地循环!!!(是两种实现方式)

总结

  1. CAS背后没有加锁,不需要加锁,背后需要靠cpu原语来实现