爱站网关键词密度,网站建设与维护 实训,网站建设企业公司,烟台seo网站诊断Unsafe类是CAS的核心#xff0c;由于Java方法无法直接访问底层#xff0c;需要通过本地方法(native)来实现#xff0c;Unsafe类相当于一个桥梁。基于Unsafe类#xff0c;可以直接操作特定的内存数据。 我们从上一篇说CAS基本原理的时候#xff0c;有说到一个“资源”被100… Unsafe类是CAS的核心由于Java方法无法直接访问底层需要通过本地方法(native)来实现Unsafe类相当于一个桥梁。基于Unsafe类可以直接操作特定的内存数据。 我们从上一篇说CAS基本原理的时候有说到一个“资源”被100个线程每个线程累加100次最终得到10000该“资源”我们使用AtomicInteger来模拟的。这篇我们就从AtomicInteger更加深入探究CAS。 AtomicInteger的getAndIncrement()方法 /*** Atomically increments by one the current value.** return the previous value*/public final int getAndIncrement() {return unsafe.getAndAddInt(this, valueOffset, 1);} AtomicInteger的getAndIncrement()方法调用的是Unsafe类中的getAndAddInt()方法其中的参数valueOffset是通过Unsafe实例的获取到当前AtomicInteger这个对象的value属性的内存偏移地址。 Unsafe的getAndAddInt()方法
public final int getAndAddInt(Object var1, long var2, int var4) {int var5;do {var5 this.getIntVolatile(var1, var2);} while(!this.compareAndSwapInt(var1, var2, var5, var5 var4));return var5;} 参数var1就是当前需要Unsafe类操作的对象在当前案例中就是AtomicInteger的一个实例。var2则是当前AtomicInteger实例也就是var1的value这个属性的变量的内存地址偏移量。var4就是案例中需要累加的值案例中是1。 接下来是一个 do{ } while循环首先通过Unsafe类的getIntVolatile()方法(native方法)拿到当前操作的AtomicInteger的实例中的value属性的值在使用Unsafe类的compareAndSwapInt()方法(native方法)将当前操作的AtomicInteger的实例中的value属性的原值和新值进行CAS。如果没有交换成功就一直重复上面的动作如果交换成功就跳出当前循环。 AtomicInteger的get()方法 /*** Gets the current value.** return the current value*/public final int get() {return value;} 等100个线程每个都完成100次累加后(案例中使用到了CountDownLatch保证100个线程都操作完成)在调用AtomicInteger的get()方法。我们发现AtomicInteger的get()方法获取的就是value这个值value属性是由volatile修饰的(在多线程环境下保证其可见性)。 最终我们发现AtomicInteger实现多线程并发保证线程安全是通CAS(compare and swap)volatile来实现的从而避免synchronized的高开销提高执行效率。