首页   快速返回

AtomicInteger源码分析要点     所属分类 java
要点

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