Java 병렬 프로그래밍의 원자 변수와 비차단 동기화 메커니즘
2355 단어 Java동시 프로그래밍원자 변수비차단 동기화 메커니즘
비차단 알고리즘은 병발 알고리즘에 속하는데 그들은 안전하게 그들의 라인을 파생시킬 수 있다. 잠금 파생을 통과하지 않고 저급의 원자성 하드웨어 원생 형식인 예를 들어 비교와 교환을 통과할 수 있다.비차단 알고리즘의 설계와 실현은 매우 어렵지만 그들은 더욱 좋은 삼키기율을 제공할 수 있고 생존 문제(예를 들어 자물쇠와 우선순위 반전)에도 더욱 좋은 방어를 제공할 수 있다.자물쇠를 비교하고 교환(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. 성능 비교: 자물쇠와 원자 변수
중저 정도의 경쟁에서 원자 변수는 매우 높은 신축성을 제공할 수 있고 원자 변수의 성능은 자물쇠를 초과한다.그러나 고강도의 경쟁에서 자물쇠는 경쟁을 더욱 효과적으로 피할 수 있고 자물쇠의 성능은 원자 변수의 성능을 초과할 것이다.그러나 더 진실한 실제 상황에서 원자 변수의 성능은 자물쇠의 성능을 초과할 것이다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
JPA + QueryDSL 계층형 댓글, 대댓글 구현(2)이번엔 전편에 이어서 계층형 댓글, 대댓글을 다시 리팩토링해볼 예정이다. 이전 게시글에서는 계층형 댓글, 대댓글을 구현은 되었지만 N+1 문제가 있었다. 이번에는 그 N+1 문제를 해결해 볼 것이다. 위의 로직은 이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.