AtomicInteger源码分析要点
所属分类 java
浏览量 1351
要点
volatile修饰的变量value,保证可见性
最终调用 Unsafe的compareAndSwapInt() 方法 CAS+自旋 乐观锁
典型使用场景 接口调用次数统计
使用 int , volatile int 并发问题
volatile 只保证可见性 无法保证原子性
使用 synchronized 和 lock , 重量级操作 影响性能
使用 Atomic系列
public class AtomicInteger extends Number implements java.io.Serializable {
private static final long serialVersionUID = 6214790243416807050L;
// setup to use Unsafe.compareAndSwapInt for updates
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); }
}
private volatile int value;
public final int getAndSet(int newValue) {
return unsafe.getAndSetInt(this, valueOffset, newValue);
}
public final int getAndIncrement() {
return unsafe.getAndAddInt(this, valueOffset, 1);
}
public final int getAndAdd(int delta) {
return unsafe.getAndAddInt(this, valueOffset, delta);
}
public final boolean compareAndSet(int expect, int update) {
return unsafe.compareAndSwapInt(this, valueOffset, expect, update);
}
// Unsafe中的方法
public final native boolean compareAndSwapInt(Object var1, long var2, int var4, int var5);
上一篇
下一篇
/proc/PID/status进程信息说明
java中的非阻塞IO和异步IO
NIO JMX BufferPool内存监控
unsafe要点
DirectByteBuffer申请与释放
一行代码摧毁jvm