java并发编程之原子操作类详情-亚博电竞手机版
juc包提供了一系列的原子性操作类,这些类都是使用非阻塞算法cas实现的,相比使用锁实现原子性操作者在性能上有很大提升。juc包中含有atomicinteger、atomiclong、atomicboolean,它们的原理类似。下面我们以atomiclong
为例来讲解。
我们先来看一下部分源码:
public class atomiclong extends number implements java.io.serializable { private static final long serialversionuid = 1927816293512124184l; //1.获取unsafe类实例 private static final unsafe unsafe = unsafe.getunsafe(); //2.存放value的偏移量 private static final long valueoffset; static final boolean vm_supports_long_cas = vmsupportscs8(); //3.用于判断是否支持long类型无锁cas private static native boolean vmsupportscs8(); static { try { //4.获取value在atomiclong中的偏移量 valueoffset = unsafe.objectfieldoffset (atomiclong.class.getdeclaredfield("value")); } catch (exception ex) { throw new error(ex); } } //5.实际变量值 private volatile long value; /** * creates a new atomiclong with the given initial value. * * @param initialvalue the initial value */ public atomiclong(long initialvalue) { value = initialvalue; } 省略部分代码 }
上面代码中,代码1处通过unsafe.getunsafe()获取到unsafe类的实例(因为atomiclong类是在rt.jar包下面的,atomicldset(long expect,long update) { return unsafe.compareandswaplong(this, valueoffset, expect, update); }
函数在内部调用了unsafe.compareandswaplong方法。如果原子变量中的value值等于expect,则使用update值更新该值并返回true,否则返回false。
到此这篇关于java并发编程之原子操作类详情的文章就介绍到这了,更多相关java 原子操作类内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!