AtomicStampedReference 구현
3180 단어 Java 동시 프로그래밍Java 기본 사항
AtomicStampedReference ABA 문제 해결
AtomicStampedReference와 AtomicReference의 차이점은 다음과 같습니다.
잠금 해제된 객체 참조: AtomicReference
타임 스탬프가 있는 객체 참조: AtomicStampedReference
AtomicStampedReference의 실현
Pair 클래스
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);
}
}
// pair
private volatile Pair pair;
public boolean compareAndSet(V expectedReference,
V newReference,
int expectedStamp,
int newStamp) {
Pair current = pair;
return
// , cas 。
expectedReference == current.reference &&
expectedStamp == current.stamp &&
((newReference == current.reference &&
newStamp == current.stamp) ||
casPair(current, Pair.of(newReference, newStamp)));
}
// pair
private boolean casPair(Pair cmp, Pair val) {
return UNSAFE.compareAndSwapObject(this, pairOffset, cmp, val);
}
실제 교체는pair를 원자 대상으로 하는 것이다
Atomic Reference, Atomic Stamped Reference와 Atomic Markable Reference의 차이
AtomicReference
volatile 및 Unsafe에서 제공하는 CAS 함수를 사용하여 원자 작업을 수행합니다.자선 + CAS의 잠금 동작은 공유 변수의 스레드 안전value가volatile 형식임을 보장합니다. 이것은 스레드가value의 값을 수정할 때 다른 스레드가 보는value의 값은 모두 최신 값입니다. 즉 수정된volatile의 값은 CAS를 통해value를 설정합니다.이것은 보증합니다. 어떤 스레드 탱크가 CAS 함수 (예:compareAndSet 함수) 를 통해value를 설정할 때, 스레드가 vu를 약간 조작할 때 중단되지 않습니다.하지만 CAS 작업에 ABA 문제가 있을 수 있습니다.Atomic Stamped Reference의 출현은 바로 이 문제를 해결하기 위한 것이다
AtomicStampedReference
구조 방법에서 initial Stamp(시간 스탬프)는 유일한 표지 인용 변수로 사용되고 구조기 내부에서 하나의 Pair 대상을 실례화했다. Pair 대상은 대상 인용과 시간 스탬프 정보를 기록하고 int를 시간 스탬프로 사용한다. 실제로 사용할 때 시간 스탬프가 유일하게(일반적으로 자증하는) 해야 한다. 만약에 시간 스탬프가 중복되면 ABA 문제가 발생할 수 있다.Atomic Stamped Reference의 모든 인용 변수에pair가 있습니다.stamp 이 시간 스탬프, 이렇게 하면 CAS의 ABA 문제를 해결할 수 있습니다.
AtomicMarkableReference
AtomicStampedReference에서는 참조 변수가 중간에 몇 번 변경되었는지 알 수 있습니다.때때로 우리는 인용 변수가 몇 번 바뀌었는지에 관심이 없고 단순히 변경되었는지에 관심이 있기 때문에 Atomic Markable Reference가 생겼다.AtomicMarkable Reference의 유일한 차이점은 int 표지로 인용하지 않고 boolean 변수를 사용합니다. 인용 변수가 변경되었는지 여부를 나타냅니다.
private static class Pair { final T reference; final boolean mark; private Pair(T reference, boolean mark) { this.reference = reference; this.mark = mark; } static Pair of(T reference, boolean mark) { return new Pair(reference, mark); } }
AtomicStampedReference에 사용되는 구덩이 정보
참조:https://blog.csdn.net/xybz1993/article/details/79992120
한 값의 인용이 변하지 않도록 해야 한다. 예를 들어 포장을 해야 한다. 상자를 뜯으면 같은 값의 대상 인용이 일치하게 변화하여 CAS가 계속 실패할 수 있다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
countdowlatch와cyclicbarrier의 용법 및 차이
한 임무가 아래로 내려가려고 하지만 다른 임무가 끝난 후에야 계속 아래로 내려갈 수 있다.만약 우리가 계속 실행하고자 하는 이 임무는 CountDownLatch 대상의await () 방법을 사용하고, 다른 임무는 자...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.
Pair 클래스
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);
}
}
// pair
private volatile Pair pair;
public boolean compareAndSet(V expectedReference,
V newReference,
int expectedStamp,
int newStamp) {
Pair current = pair;
return
// , cas 。
expectedReference == current.reference &&
expectedStamp == current.stamp &&
((newReference == current.reference &&
newStamp == current.stamp) ||
casPair(current, Pair.of(newReference, newStamp)));
}
// pair
private boolean casPair(Pair cmp, Pair val) {
return UNSAFE.compareAndSwapObject(this, pairOffset, cmp, val);
}
실제 교체는pair를 원자 대상으로 하는 것이다
Atomic Reference, Atomic Stamped Reference와 Atomic Markable Reference의 차이
AtomicReference
volatile 및 Unsafe에서 제공하는 CAS 함수를 사용하여 원자 작업을 수행합니다.자선 + CAS의 잠금 동작은 공유 변수의 스레드 안전value가volatile 형식임을 보장합니다. 이것은 스레드가value의 값을 수정할 때 다른 스레드가 보는value의 값은 모두 최신 값입니다. 즉 수정된volatile의 값은 CAS를 통해value를 설정합니다.이것은 보증합니다. 어떤 스레드 탱크가 CAS 함수 (예:compareAndSet 함수) 를 통해value를 설정할 때, 스레드가 vu를 약간 조작할 때 중단되지 않습니다.하지만 CAS 작업에 ABA 문제가 있을 수 있습니다.Atomic Stamped Reference의 출현은 바로 이 문제를 해결하기 위한 것이다
AtomicStampedReference
구조 방법에서 initial Stamp(시간 스탬프)는 유일한 표지 인용 변수로 사용되고 구조기 내부에서 하나의 Pair 대상을 실례화했다. Pair 대상은 대상 인용과 시간 스탬프 정보를 기록하고 int를 시간 스탬프로 사용한다. 실제로 사용할 때 시간 스탬프가 유일하게(일반적으로 자증하는) 해야 한다. 만약에 시간 스탬프가 중복되면 ABA 문제가 발생할 수 있다.Atomic Stamped Reference의 모든 인용 변수에pair가 있습니다.stamp 이 시간 스탬프, 이렇게 하면 CAS의 ABA 문제를 해결할 수 있습니다.
AtomicMarkableReference
AtomicStampedReference에서는 참조 변수가 중간에 몇 번 변경되었는지 알 수 있습니다.때때로 우리는 인용 변수가 몇 번 바뀌었는지에 관심이 없고 단순히 변경되었는지에 관심이 있기 때문에 Atomic Markable Reference가 생겼다.AtomicMarkable Reference의 유일한 차이점은 int 표지로 인용하지 않고 boolean 변수를 사용합니다. 인용 변수가 변경되었는지 여부를 나타냅니다.
private static class Pair { final T reference; final boolean mark; private Pair(T reference, boolean mark) { this.reference = reference; this.mark = mark; } static Pair of(T reference, boolean mark) { return new Pair(reference, mark); } }
AtomicStampedReference에 사용되는 구덩이 정보
참조:https://blog.csdn.net/xybz1993/article/details/79992120
한 값의 인용이 변하지 않도록 해야 한다. 예를 들어 포장을 해야 한다. 상자를 뜯으면 같은 값의 대상 인용이 일치하게 변화하여 CAS가 계속 실패할 수 있다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
countdowlatch와cyclicbarrier의 용법 및 차이
한 임무가 아래로 내려가려고 하지만 다른 임무가 끝난 후에야 계속 아래로 내려갈 수 있다.만약 우리가 계속 실행하고자 하는 이 임무는 CountDownLatch 대상의await () 방법을 사용하고, 다른 임무는 자...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.
참조:https://blog.csdn.net/xybz1993/article/details/79992120
한 값의 인용이 변하지 않도록 해야 한다. 예를 들어 포장을 해야 한다. 상자를 뜯으면 같은 값의 대상 인용이 일치하게 변화하여 CAS가 계속 실패할 수 있다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
countdowlatch와cyclicbarrier의 용법 및 차이한 임무가 아래로 내려가려고 하지만 다른 임무가 끝난 후에야 계속 아래로 내려갈 수 있다.만약 우리가 계속 실행하고자 하는 이 임무는 CountDownLatch 대상의await () 방법을 사용하고, 다른 임무는 자...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.