CAS(Compare and Swap)

3026 단어
자바 병렬 프로 그래 밍 - 잠 금 없 는 CAS 와 Unsafe 류 및 패키지 Atomic
소개
CAS (Compare and Swap), 즉 비교 하고 교체 하 며 병렬 알고리즘 을 실현 할 때 자주 사용 하 는 기술 로 성능 이 synchronized 잠 금 작업 보다 훨씬 좋 고 잠 금 없 는 전략 에 속 합 니 다.
    :CAS(V,E,N)

CAS 의 사상 은 매우 간단 합 니 다. 세 개의 매개 변 수 는 현재 메모리 값 V, 오래된 예상 치 E, 곧 업 데 이 트 될 값 N 입 니 다. 예상 치 E 와 메모리 값 V 만 동시에 메모리 값 을 N 으로 수정 하고 true 로 되 돌려 줍 니 다. 그렇지 않 으 면 아무것도 하지 않 고 false 로 돌아 갑 니 다.
2. JAVA 실현
CPU 명령 의 CAS 지원 (원자 조작)
아마도 우 리 는 이러한 의문 이 있 을 것 입 니 다. 만약 에 여러 개의 스 레 드 가 CAS 작업 을 수행 하고 CAS 의 절차 가 많다 고 가정 하면 V 와 E 가 같다 고 판단 한 후에 값 을 부여 하려 고 할 때 스 레 드 를 전환 하여 값 을 변경 할 수 있 습 니 다.데이터 가 일치 하지 않 았 나 요?정 답 은 부정 적 이다. CAS 는 시스템 원 어 이기 때문에 원 어 는 운영 체제 용어 의 범주 에 속 하고 여러 가지 명령 으로 구성 되 어 특정한 기능 을 완성 하 는 과정 에 사용 되 며 원 어의 집행 은 반드시 연속 적 이 어야 한다. 집행 과정 에서 중단 되 는 것 을 허락 하지 않 는 다. 즉, CAS 는 CPU 의 원자 명령 으로 이른바 데이터 불일치 문 제 를 일 으 키 지 않 는 다 는 것 이다.
Unsafe
Unsafe 는 CAS 의 핵심 클래스 입 니 다. 자바 방법 으로 바 텀 시스템 에 직접 접근 할 수 없 기 때문에 로 컬 (native) 방법 으로 접근 해 야 합 니 다. Unsafe 는 하나의 뒷문 에 해당 합 니 다. 이 종 류 를 바탕 으로 특정 메모리 의 데 이 터 를 직접 조작 할 수 있 습 니 다.
CAS 는 일부 CPU 가 직접 지원 하 는 명령 이다. 즉, 우리 가 앞에서 분석 한 잠 금 없 는 조작 이다. 자바 에서 잠 금 없 는 조작 CAS 는 다음 과 같은 3 개의 Unsafe 류 방법 을 바탕 으로 이 루어 진다. Atomic 시리즈 내부 방법 은 다음 과 같은 방법 을 바탕 으로 이 루어 진다.
//     o     ,offset         ,                        ,
//expected     ,x       ,  3      CAS        。
public final native boolean compareAndSwapObject(Object o, long offset,Object expected, Object x);                                                                                                  

public final native boolean compareAndSwapInt(Object o, long offset,int expected,int x);

public final native boolean compareAndSwapLong(Object o, long offset,long expected,long x);

문제
CAS 에는 ABA 문제 라 는 뚜렷 한 문제 가 존재 한다.문제: 변수 V 가 처음 읽 었 을 때 A 였 고 할당 을 준비 할 때 A 임 을 확인 하면 다른 스 레 드 에 의 해 수정 되 지 않 았 음 을 설명 할 수 있 습 니까?만약 이 기간 에 B 로 바 뀌 었 다가 다시 A 로 바 뀌 었 다 면 CAS 조작 은 지금까지 수 정 된 적 이 없다 고 오해 할 것 이다.이러한 상황 에 대해 자바 및 패키지 에 표 시 된 원자 인용 류 AtomicStamped Reference 를 제공 합 니 다. AtomicStamped Reference 원자 류 는 시간 스탬프 (int 형식, 시간 스탬프 가 아 닌) 가 있 는 대상 참조 입 니 다. 수정 할 때마다 AtomicStamped Reference 는 새로운 값 을 설정 할 뿐만 아니 라 변 경 된 시간 도 기록 합 니 다.Atomic Stamped Reference 가 대상 값 을 설정 할 때 대상 값 과 시간 스탬프 는 기대 치 를 만족 시 켜 야 기록 에 성공 할 수 있 습 니 다. 이것 은 반복 적 으로 읽 고 쓸 때 값 이 수정 되 었 는 지 예측 할 수 없 는 곤경 을 해결 합 니 다.
public class AtomicStampedReference {
    //  Pair           
    private static class Pair {
        final T reference;
        final int stamp;
        private Pair(T reference, int stamp) {
            this.reference = reference;
            this.stamp = stamp;
        }
        static  Pair of(T reference, int stamp) {
            return new Pair(reference, stamp);
        }
    }
    //           
    private volatile Pair pair;

    //   ,               
    public AtomicStampedReference(V initialRef, int initialStamp) {
        pair = Pair.of(initialRef, initialStamp);
    }
}

좋은 웹페이지 즐겨찾기