网站安全建设的重要性,工程造价信息价在什么网站查,网站制作邯郸,湖南省重点建设项目办公室网站如果你了解了AtomicInteger的工作原理#xff0c;或者看了如下文章#xff0c;知道了AtomicInteger只能对当个int类型共享变量做cas的缺点。
CAS之AtomicInteger原理解析_z275598733的博客-CSDN博客
那么AtomicReference就是来解决这个问题的。原理很类似#xff0c;只是A…如果你了解了AtomicInteger的工作原理或者看了如下文章知道了AtomicInteger只能对当个int类型共享变量做cas的缺点。
CAS之AtomicInteger原理解析_z275598733的博客-CSDN博客
那么AtomicReference就是来解决这个问题的。原理很类似只是AtomicReference是对对象做cas操作。从一段AtomicReference类的方法调用代码开始来对源码做分析
public class Test {public static void main(String[] args) {A a1 new A(0, 0l);A a2 new A(1, 1l);AtomicReferenceA ar new AtomicReference(a1);ar.getAndSet(a2);System.out.println(ar.get().toString());//打印对象ai的内存结构需要引入jol-core工具包ClassLayout classLayout ClassLayout.parseInstance(ar);System.out.println(classLayout.toPrintable());}
}Getter
Setter
AllArgsConstructor
ToString
class A{private int v1;private double v2;
}
从 new AtomicReference(a1)进入先看静态代码块和构造方法再看 ar.getAndSet(a2) 做了什么。
public class AtomicReferenceV implements java.io.Serializable {...static {try {valueOffset unsafe.objectFieldOffset(AtomicReference.class.getDeclaredField(value));} catch (Exception ex) { throw new Error(ex); }}//与AtomicInterger类基本一致只不过类型由int变成了泛型Vprivate volatile V value;public AtomicReference(V initialValue) {value initialValue;}//与对象public final boolean compareAndSet(V expect, V update) {//this-当前AtomicReference对象valueoffest-相对AtomicReference的内存偏移量expectreturn unsafe.compareAndSwapObject(this, valueOffset, expect, update);}//具体实现需要进入到Unsafe类中public final V getAndSet(V newValue) {this-当前AtomicReference对象valueoffest-相对this对象的内存偏移量newValue-新对象return (V)unsafe.getAndSetObject(this, valueOffset, newValue);}...
} 进入到Unsafe.getAndSetObject方法中
public final class Unsafe {...public final Object getAndSetObject(Object var1, long var2, Object var4) {Object var5;do {//通过对象中value相对偏移量获取内存中的value对象这里var5对其他线程是可见的, 如果不可见那么这个值的获取就可能非内存真实值。与Unsafe.getAndAddInt异曲同工var5 this.getObjectVolatile(var1, var2);//compareAndSwapObject的过程是原子性的将重新获取到的内存对象value与var5比较true则说明对象value并未被修改可以将原对象改成var4。区别于Unsafe.compareAndSwapInt, 这里比较对象} while(!this.compareAndSwapObject(var1, var2, var5, var4));return var5;}//native方法暂不深究public final native boolean compareAndSwapObject(Object var1, long var2, Object var4, Object var5);...
} 以下是debug的信息 AtomicReference类对象ar的内存结构 总而言之AtomicReference可以保证对象的修改是线程安全的AtomicReference对比AtomicInteger 可以在共享对象内部维护多个共享变量但是ABA问题依然没有解决。