最近准备认真看一下Concurrent包的源码,在这里也算做一下记录吧
作为java的并发包,Concurrent里首先提供了一些原子类,用于实现多线程下的线程同步。
先看AtomicInteger的成员变量和初始化方法
// 用于进行更新操作
private static final Unsafe unsafe = Unsafe.getUnsafe();
private static final long valueOffset;
static {
try {
valueOffset = unsafe.objectFieldOffset
(AtomicInteger.class.getDeclaredField("value"));
} catch (Exception ex) { throw new Error(ex); }
}
//AtomicInteger的值
private volatile int value;
/**
* 初始化方法
*/
public AtomicInteger() {
}
首先有两个静态成员变量,一个是Unsafe类(关于Unsafe的介绍可以看这篇技术博客https://tech.meituan.com/2019/02/14/talk-about-java-magic-class-unsafe.html),它可以通过内存级别管理资源。而在类加载并初始化的过程中,通过Unsafe类可以得到私有成员变量value的内存偏移量。
public final int getAndIncrement() {
return unsafe.getAndAddInt(this, valueOffset, 1);
}
而在实现原子增加的时候,则会借助unsafe对象的getAndAddInt方法实现原子级别的加1
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;
}
在Unsafe类中,getAndAddInt则是通过cas的方法,首先获得内存现在的值var5,当对象var1内存偏移量为var2的值等于var5时,将var5+var4的值set到这个位置,compareAndSwapInt是native方法,通过保证compareAndSwapInt的原子性,来实现AtomicInteger原子性的增加