(가) -AtomicBoolean 소스 구문 분석 구문 분석 AQS 소스

  • 기본 카테고리 :
  • Array 타입 :
    • 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로 부울 변환
  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