- Compare And Swap
- cas(V, Expected, NewValue)===>第一个参数为要修改的值,第二个参数为期望看到的值,第三个参数为新值
- if V==E
- V=New
- otherwise try again or fail
- 失败之后有可能再试一遍,也有可能就失败了
- CPU原语支持===>是cpu原语指令层面的支持,中间不能被打断===>原子性
ABA问题通过加version解决(加标签)
- 每次操作都进行版本修改(加1),之后检查跟版本号一块检查
- Atomic中有带版本号的类(AtomicStampedReference)
- 加个时间戳!
- ABA在基本类型上没什么问题!在引用类型上就有问题
- 引用会有问题,不是引用问题不大
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,来不断地循环!!!(是两种实现方式)
总结
- CAS背后没有加锁,不需要加锁,背后需要靠cpu原语来实现