文章目录

今天,来分享下 AtomicInteger 与乐观锁。

基于 JDK 7 进行源码分析。

AtomicInteger 是支持原子操作的 Integer 类,它采用基于 CAS 的乐观锁实现。乐观锁,顾名思义,采取乐观的态度,每次操作都假设不会发生并发冲突,因此不会上锁,只在更新操作时检查是否违反数据完整性,换句话说,在更新操作时判断在此期间别人是否更新这个数据。如果发现并发冲突,则让抛出错误的信息,让用户决定如何去做。

首先,我们先阅读下 incrementAndGet() 方法。其中,这个方法中,先获取到当前的 current 值,然后将 current 加 1,赋值给一个局部的 next 变量,但是,这两步都是非线程安全的。最后一步至关重要,它调用了 compareAndSet(int expect, int update) 方法。

public final int incrementAndGet() {
    for (;;) {
        int current = get();
        int next = current + 1;
        if (compareAndSet(current, next))
            return next;
    }
}

注意的是,其中 for 是一个死循环,通过不断地尝试乐观锁操作,直到成功才退出。

compareAndSet(int expect, int update) 方法中,调用了 compareAndSwapInt(Object var1, long var2, int var4, int var5) 方法。

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

compareAndSwapInt(Object var1, long var2, int var4, int var5) 方法 是 native 方法,利用 JNI 调用底层其他语言实现的方法,它是基于 CPU 的 CAS 指令来实现的。

public final native boolean compareAndSwapInt(Object var1, long var2, int var4, int var5);

AtomicInteger 中的 addAndGet(int delta) 方法与 decrementAndGet() 方法也是相同的实现。此外,java.util.concurrent.atomic 包下 AtomicBoolean、 AtomicInteger 、AtomicLong 等以 Atomic* 开头的类原理是一致的,都使用到了乐观锁。

(完)

微信公众号

文章目录