原子類-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保證多線程可見性。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章