1. 논블로킹 알고리즘
비차단 알고리즘은 잠금 생성을 통하지 않고 비교 및 스왑과 같은 하위 수준 하드웨어 기본 형태의 원자성을 통해 스레드를 안전하게 생성할 수 있는 동시 알고리즘입니다. 비차단 알고리즘은 설계 및 구현이 매우 어렵지만 교착 상태 및 우선 순위 반전과 같은 생존 문제에 대해 더 나은 처리량과 더 나은 방어 기능을 제공할 수 있습니다. CAS(비교 및 교체)와 같은 잠금을 대체하려면 낮은 수준의 원자 기계 명령어를 사용하세요.
2. 비관적인 기술
배타적 잠금은 최악의 시나리오(잠금이 잠겨 있지 않으면 다른 스레드가 객체 상태를 파괴함)가 발생한다고 가정하고, 최악의 시나리오가 발생하지 않더라도 객체 상태는 여전히 보호됩니다. 자물쇠.
3. 낙관적인 기술
종속성 충돌 모니터링. 모니터링 중에 충돌이 발생하면 업데이트를 포기하고 다시 시도하십시오. 그렇지 않으면 업데이트가 성공합니다. 이제 프로세서에는 비교 및 교환(CAS, 비교)과 같은 원자성 읽기-수정-쓰기 명령이 있습니다. -그리고- 교환).
4.CAS 운영
CAS에는 3개의 피연산자, 즉 메모리 값 V, 이전 예상 값 A, 수정될 새 값 B가 있습니다. 예상 값 A와 메모리 값 V가 동일한 경우에만 메모리 값 V를 B로 수정하고, 그렇지 않으면 아무 작업도 수행하지 않습니다. CAS의 일반적인 사용 패턴은 다음과 같습니다. 먼저 V에서 A를 읽고 A를 기반으로 새 값 B를 계산한 다음 CAS를 사용하여 V의 값을 A에서 B로 원자적으로 변경합니다(스레드가 V의 값을 변경하지 않는 한). 이 기간 동안) 값을 다른 값으로 변경).
목록 3. 비교 및 교체 동작(성능은 아님)을 보여주는 코드 아래 코드를 복사하세요.
공개 클래스 SimulatedCAS {
비공개 int 값;
공개 동기화 int getValue() { 반환 값 }
공개 동기화 int CompareAndSwap(int ExpectValue, int newValue) {
int oldValue = 값;
if (값 == 예상값)
값 = 새 값;
oldValue를 반환합니다.
}
}
목록 4. 비교 및 교환을 사용하여 카운터 복사 코드를 구현합니다.
공개 클래스 CasCounter {
비공개 SimulatedCAS 값;
공개 int getValue() {
return value.getValue();
}
공개 int 증가() {
int oldValue = value.getValue();
while(value.compareAndSwap(oldValue, oldValue + 1) != oldValue)
oldValue = value.getValue();
oldValue + 1을 반환합니다.
}
}
5. 원자변수
원자 변수는 잠금 보호 없이 원자 업데이트 작업을 지원하며 기본 레이어는 CAS를 사용하여 구현됩니다. 총 12개의 원자 변수가 있으며 이는 스칼라 클래스, 업데이트 클래스, 배열 클래스 및 복합 변수 클래스의 4개 그룹으로 나눌 수 있습니다. 가장 일반적으로 사용되는 원자 변수는 스칼라 클래스(AtomicInteger, AtomicLong, AtomicBoolean 및 AtomicReference)입니다. CAS는 모든 유형에서 지원됩니다.
6. 성능 비교: 잠금 및 원자 변수
경합이 낮거나 중간인 경우 원자 변수는 높은 확장성을 제공할 수 있으며, 원자 변수의 성능은 잠금 성능을 초과합니다. 고강도 경합에서는 잠금이 경합을 더 효과적으로 피할 수 있으며 잠금 성능은 원자 변수의 성능을 초과합니다. 변수. 그러나 보다 현실적인 실제 상황에서는 원자 변수의 성능이 잠금 성능을 초과합니다.