(A)-AtomicBooleanソース解析を解析AQS源

  • 基本的なカテゴリ:
  • 配列型:
    • AtomicIntegerArray
    • AtomicLongArray
    • AtomicReferenceArray

入門

そのため、マルチスレッドの条件で、あなたが共有変数のために、我々はセキュリティスレッドは、次の方法があることを確認する必要があるので、データの不整合が発生する可能性の共有変数を変更する場合:

  1. 使用lockまたはsynchronized共有変数を同期
  2. CASは、アトミック操作を保証するために、変数のメソッドを変更するために使用されます

後者のクラスは、原子変更CASに基づいています。

原則

  1. 真のブール変換intタイプは示します:1は、0が真偽表し
  2. メモリアドレスの値を取得するには、クラスで初期化する場合
  3. 呼び出しUnsafe.compareAndSwant方法は、CAS値の基本原理(CMPXCHGでCPU命令)を変更

機能

  1. CASに基づいてスレッドの安全性を実現
  2. 実装するCloneableインタフェースを、クローニングされ
  3. これは、実装Serializableのインターフェイスを、直列化伝送をサポート

ソース決意

メンバ変数

    private static final long serialVersionUID = 4654671469794556979L;
    // setup to use Unsafe.compareAndSwapInt for updates
    //使用unsafe类进行cas
    private static final Unsafe unsafe = Unsafe.getUnsafe();
    //获取该值得偏移量(内存中的地址)
    private static final long valueOffset;
    /**
     * 内部使用int来做boolean的设置
     * 默认为0
     */
    private  volatile int value;
  1. serialVersionUID:シーケンスID-
  2. unsafe:原子コアクラスは、メモリの低レベル動作を行うため、すべての内部クラスであるnativeメソッド
  3. valueOffset:メモリオフセットアドレスフィールドの値
  4. value:真の値は、1が真の0が偽表し、使用volatileメモリの視認性を確保するため

クラスの初期化処理

    static {
        try {
           //返回对象成员属性在内存地址相对于此对象的内存地址的偏移量
            valueOffset = unsafe.objectFieldOffset
                (AtomicBoolean.class.getDeclaredField("value"));
        } catch (Exception ex) { throw new Error(ex); }
    }

メインメモリは、値の価値が危険な方法でオフセットを取得することです

メンバー方法

取得する()

ブール変数を取得します。

    /**
     * 返回当前值
     */
    public final boolean get() {
        return value != 0;
    }

ブールのcompareAndSet(ブール値は、ブール値の更新を期待して)

割り当ては、割り当て障害が発生する前の状況を比較した後の値があるかもしれません

     /*
      * 只有当期待的值为expect的时候才会更新相关值
      *  1. 期待的值等于现在值,则成功赋值,返回true
      *  2. 期待的值不等于现在的值,则赋值失败,则返回false
      */
    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);
    }
  1. int型のboolean型の変換
  2. するために呼び出すcompareAndSwapIntCAS割り当てること
  3. 成功のためにはtrueを返し、偽の失敗を示します

boolean getAndSet(boolean newValue)

比较前值后进行赋值,用的相对较多

    public final boolean getAndSet(boolean newValue) {
        boolean prev;
        do {
            prev = get();
        } while (!compareAndSet(prev, newValue));
        return prev;
    }
  1. 先获取之前值
  2. 在调用循环compareAndSet进行CAS赋值

void set(boolean newValue)

无条件设置值,用的相对较少

    public final void set(boolean newValue) {
        value = newValue ? 1 : 0;
    }

void lazySet(boolean newValue)

也是赋值操作,该操作会让Java插入StoreStore内存屏障,避免发生写操作重排序

public final void lazySet(boolean newValue) {
    int v = newValue ? 1 : 0;
    unsafe.putOrderedInt(this, valueOffset, v);
}

总结

  1. 该类是原子性boolean类,是线程安全的
  2. 该原子类的核心操作都是基于Unsafe类
  3. CAS普遍会产ABA问题

おすすめ

転載: www.cnblogs.com/lonecloud/p/11392032.html