AtomicStampedReference源码解析
AtomicStampedReference类介绍
AtomicReference或者说CAS存在一个比较常见的问题,就是ABA问题。因此,JDK提供了AtomicStampedReference来解决CAS中的ABA问题。
类图
主要属性
1 | private volatile Pair<V> pair; |
pair:内部类对象,主要用来持有reference和stamp
UNSAFE:JDK提供的实现CAS算法的类
pairOffset:pair域在整个类中的内存偏移量
主要方法
AtomicStampedReference(V,int)
1 | /** |
调用pair的of方法,生成一个新的pair对象。
public V getReference()
1 | /** |
返回AtomicStampedReference持有的引用。
public int getStamp()
1 | /** |
返回当前Reference被修改的次数
get(int[])
1 | /** |
获取当前AtomicStampedReference持有的引用Reference和stamp
weakCompareAndSet(V,V,int,int)
1 | /** |
从父类的注释上看,这个方法的本意是,调用weakCompareAndSet方法时不能保证指令重排的发生,因此,这个方法有时候会毫无理由地失败。
但是从实现上来看,该方法就是compareAndSet方法。
compareAndSet(V,V,int,int)
1 | /** |
如果当前的引用current.reference等于expectedReference,当前的“时间戳”等于期望的“时间戳”expectedStamp,那么就把当前的引用和“时间戳”全部更新为新的引用和“时间戳”。
set(V,int)
1 | /** |
将当前的引用和“时间戳”设置为新的引用和“时间戳”。
attemptStamp(V,int)
1 | /** |
“尝试”更新当前的引用和“时间戳”。调用的casPair方法可能失败。
casPair(Pair,Pair)
1 | private boolean casPair(Pair<V> cmp, Pair<V> val) { |
如果当前的pair和cmp相等,则将pair替换为val。
objectFieldOffset(Unsafe,String,Class)
1 | static long objectFieldOffset(sun.misc.Unsafe UNSAFE, |
获取字段pair在整个类中的内存偏移量。
应用
1 | public static void main(String[] args) { |