Java 병렬 프로그래밍의 원자 변수와 비차단 동기화 메커니즘

1. 비차단 알고리즘
비차단 알고리즘은 병발 알고리즘에 속하는데 그들은 안전하게 그들의 라인을 파생시킬 수 있다. 잠금 파생을 통과하지 않고 저급의 원자성 하드웨어 원생 형식인 예를 들어 비교와 교환을 통과할 수 있다.비차단 알고리즘의 설계와 실현은 매우 어렵지만 그들은 더욱 좋은 삼키기율을 제공할 수 있고 생존 문제(예를 들어 자물쇠와 우선순위 반전)에도 더욱 좋은 방어를 제공할 수 있다.자물쇠를 비교하고 교환(CAS,compare-and-swap)하는 등 밑바닥의 원자화 기계 명령을 사용합니다.
2. 비관적 기술
독점 자물쇠는 일종의 비관적인 기술이다.그것은 최악의 상황이 발생한다고 가정한다. (만약 자물쇠를 채우지 않으면 다른 라인은 대상 상태를 파괴할 것이다.) 최악의 상황이 발생하지 않더라도 자물쇠로 대상 상태를 보호한다.
3. 낙관적 기술
충돌 모니터링에 의존하다.먼저 업데이트하고 모니터링 충돌이 발생하면 업데이트를 포기하고 다시 시도하십시오. 그렇지 않으면 업데이트가 성공합니다.현재 프로세서에는 원자화된 읽기-고치기-쓰기 명령이 있습니다. 예를 들어 비교와 교환(CAS,compare-and-swap)입니다.
4.CAS 작업
CAS에는 3개의 작업 수, 메모리 값 V, 이전 예상 값 A, 수정할 새 값 B가 있습니다.그리고 예상치 A와 메모리 값 V가 동시에 있을 때만 메모리 값 V를 B로 수정합니다. 그렇지 않으면 아무것도 하지 않습니다.CAS의 일반적인 사용 모드는 먼저 V에서 A를 읽고 A에 따라 새 값 B를 계산한 다음 CAS를 통해 원자 방식으로 V의 값을 A에서 B로 바꾸는 것이다(이 기간 동안 아무런 라인도 없이 V의 값을 다른 값으로 수정하는 경우).
명세서성능 대신 비교 및 교환 행위를 설명하는 코드

public class SimulatedCAS {
     private int value;

     public synchronized int getValue() { return value; }

    public synchronized int compareAndSwap(int expectedValue, int newValue) {
         int oldValue = value;
         if (value == expectedValue)
             value = newValue;
         return oldValue;
     }
}

명세서비교 및 교환을 사용하여 계수기를 실현하다

public class CasCounter {
    private SimulatedCAS value;
    public int getValue() {
        return value.getValue();
    }
    public int increment() {
        int oldValue = value.getValue();
        while (value.compareAndSwap(oldValue, oldValue + 1) != oldValue)
            oldValue = value.getValue();
        return oldValue + 1;
    }
}
5. 원자 변수
원자 변수는 자물쇠 보호 없이 원자성 업데이트 작업을 지원하며 그 밑바닥은 CAS로 이루어진다.모두 12개의 원자 변수가 있는데 4조로 나눌 수 있는데 그것이 바로 표량류, 갱신기류, 수조류와 복합변수류이다.가장 자주 사용하는 원자 변수는 바로 표량류: Atomic Integer, Atomic Long, Atomic Boolean 및 Atomic Reference이다.모든 유형은 CAS를 지원합니다.
6. 성능 비교: 자물쇠와 원자 변수
중저 정도의 경쟁에서 원자 변수는 매우 높은 신축성을 제공할 수 있고 원자 변수의 성능은 자물쇠를 초과한다.그러나 고강도의 경쟁에서 자물쇠는 경쟁을 더욱 효과적으로 피할 수 있고 자물쇠의 성능은 원자 변수의 성능을 초과할 것이다.그러나 더 진실한 실제 상황에서 원자 변수의 성능은 자물쇠의 성능을 초과할 것이다.

좋은 웹페이지 즐겨찾기