juc原子类之二:基本类型原子类AtomicInteger(AtomicLong、AtomicBoolean)

一、AtomicInteger简介

AtomicInteger, AtomicLong和AtomicBoolean这3个基本类型的原子类的原理和用法相似。以AtomicInteger对基本类型的原子类进行介绍。

二、AtomicInteger源码分析

2.1、类图结构

2.2、数据结构

2.3、AtomicInteger中的lock

使用Unsafe的cas。

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; //注意value变量的volatile属性

功能说明:
1、获取Unsafe对象
2、valueOffset是通过反射获取AtomicInteger类中value在内存中的位置。

接着看cas调用:

public final boolean compareAndSet(int expect, int update) {   
       return unsafe.compareAndSwapInt(this, valueOffset, expect, update);
}

功能:
通过CAS算法,设置value的值。CAS算法就是先比较value的值和expect的值是否相同,如果相同就设置update。如果不相同则设置失败。

注意下,上面对value值修改时,是通过value的valueOffset来进行的。这样就保证了,对value的原子操作。

2.4、成员变量

    private static final Unsafe unsafe;
    private static final long valueOffset;
    private volatile int value;

2.5、构造函数

    public AtomicInteger(int i)
    {
        value = i;
    }

2.6、赋值元素

    public final void set(int i)
    {
        value = i;
    }

2.7、查询元素

    public final int get()
    {
        return value;
    }

2.8、自增自减

    public final int incrementAndGet()
    {
        return unsafe.getAndAddInt(this, valueOffset, 1) + 1;
    }

    public final int decrementAndGet()
    {
        return unsafe.getAndAddInt(this, valueOffset, -1) - 1;
    }

三、JDK或开源框架中使用


LinkedBlockingQueue中队列元素的总数量是用AtomicInteger来存储的。

四、示例

原文地址:https://www.cnblogs.com/duanxz/p/3463385.html