原子类-AtomicBoolean类源码分析

常见的原子类:

  • 基本类: 
    AtomicInteger、AtomicLong、AtomicBoolean;
  • 引用类型: 
    AtomicReference、AtomicReference的ABA实例、AtomicStampedRerence、AtomicMarkableReference;
  • 数组类型: 
    AtomicIntegerArray、AtomicLongArray、AtomicReferenceArray
  • 属性原子修改器(Updater): 
    AtomicIntegerFieldUpdater、AtomicLongFieldUpdater、AtomicReferenceFieldUpdater

本节介绍:AtomicBoolean类


1.首先维护了一个volatile的value,保证线程可见

    private volatile int value;

2.get方法

    public final boolean get() {
        return value != 0;
    }

3.getAndSet

    /**
     * Atomically sets to the given value and returns the previous value.
     *
     * @param newValue the new value
     * @return the previous value
     */
    public final boolean getAndSet(boolean newValue) {
        boolean prev;
        do {
            prev = get();
        } while (!compareAndSet(prev, newValue));
        return prev;
    }

4.compareAndSet

    /**
     * Atomically sets the value to the given updated value
     * if the current value {@code ==} the expected value.
     *
     * @param expect the expected value
     * @param update the new value
     * @return {@code true} if successful. False return indicates that
     * the actual value was not equal to the expected value.
     */
    public final boolean compareAndSet(boolean expect, boolean update) {
        int e = expect ? 1 : 0;
        int u = update ? 1 : 0;
        return unsafe.compareAndSwapInt(this, valueOffset, e, u);
    }

5.set

    /**
     * Unconditionally sets to the given value.
     *
     * @param newValue the new value
     */
    public final void set(boolean newValue) {
        value = newValue ? 1 : 0;
    }

由此可见,原子类底层使用的是unsafe类的CAS来控制原子操作的,如果CAS失败则一直尝试。而且value使用volatile保证多线程可见性。


猜你喜欢

转载自blog.csdn.net/dxh0823/article/details/80588090
今日推荐