Java之AtomicInteger详解

一:概念

官方文档:
An value that may be updated atomically. An is used in applications such as atomically incremented counters, and cannot be used as a replacement for an Integer.
首先它是一个自动更新的值。其次是一种是应用于诸如自动递增的计数器。

二:简述和说明

在Java语言中,++i和i++操作并不是线程安全的,在使用的时候,不可避免的会用到synchronized关键字。而AtomicInteger则通过一种线程安全的方式进行加减操作。

三:部分源码分析

unsafe是java提供的获得对对象内存地址访问的类,它的作用就是在更新操作时提供“比较并替换”(CAP)的作用。
valueOffset是用来记录value本身在内存的编译地址的,这个记录,也主要是为了在更新操作在内存中找到value的位置,方便比较。
value使用了volatile关键字,volatile在这里可以做到的作用是使得多个线程可以共享变量。即,保证在更新操作时,当前线程可以拿到value最新的值。
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;
private volatile int value;

static {
    try {
        valueOffset = unsafe.objectFieldOffset
            (AtomicInteger.class.getDeclaredField("value"));
    } catch (Exception ex) { throw new Error(ex); }
}

自动递增核心代码分析:
public final int incrementAndGet() {
for (;;) {
int current = get();
int next = current + 1;
if (compareAndSet(current, next))
return next;
}
}
通过源码,可以知道,这个方法的做法为先获取到当前的 value 属性值,然后将 value 加 1,赋值给一个局部的 next 变量,然而,这两步都是非线程安全的,但是内部有一个死循环,不断去做compareAndSet操作,直到成功为止。

类似的,还有decrementAndGet()方法。它和incrementAndGet()的区别是将 value 减 1,赋值给next 变量。
AtomicInteger中还有getAndIncrement() 和getAndDecrement() 方法,他们的实现原理和上面的两个方法完全相同,区别是返回值不同,前两个方法返回的是改变之后的值,即next。而这两个方法返回的是改变之前的值,即current。

四:AtomicInteger使用总结

AtomicInteger是在使用非阻塞算法实现并发控制,在一些高并发程序中非常适合,但并不能每一种场景都适合,不同场景要使用使用不同的数值类。

猜你喜欢

转载自blog.csdn.net/ruben95001/article/details/79843197
今日推荐