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并不是无阻塞,只是阻塞并非在语言、线程方面,而是在硬件层面,所以无疑这样的操作会更快更高效。
网友评论