AtomicInteger详解

AtomicInteger类在java.util.concurrent.atomic包下面,类的定义如下:

public class AtomicInteger extends Number implements java.io.Serializable

我们可以看到继承了Number类,实现了相关的方法:

public long longValue() 
{   
 return (long)get();
}
public float floatValue()
 {   
 return (float)get();
}
public double doubleValue()
 {   
 return (double)get();
}

分析getAndSet方法
源代码如下:

public final int getAndSet(int newValue) 
{    
      for (;;)   {      //for循环一直在执行
                  int current = get();      //获取当前的值
                 if (compareAndSet(current, newValue))  //新值替代旧值
                  return current;    //返回当前值
  }
}

分析getAndIncrement方法
源代码分析:

public final int getAndIncrement() {
        for (;;) {
            int current = get();   //获取当前值
            int next = current + 1;  //当前值加1
            if (compareAndSet(current, next))  //设置新值
                return current;
        }
    }

我们看下compareAndSet方法,设值都是通过该方法来进行的

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

调用了unsafe.compareAndSwapInt的方法,是一个native方法,jvm把具体的阻塞过程交给了硬件—CPU和内存,利用CPU的多处理能力,实现硬件层面的阻塞,再加上volatile变量的特性即可实现基于原子操作的线程安全。所以说,CAS并不是无阻塞,只是阻塞并非在语言、线程方面,而是在硬件层面,所以无疑这样的操作会更快更高效。

你可能感兴趣的:(AtomicInteger详解)