Java의 의 compareAndSet()
메소드가 원자 적으로 작동합니다. 따라서 동일한 객체에서 동시에 두 가지 메소드를 실행할 수는 없습니다. 그러나 스레드 중 하나가 compareAndSet()
메서드를 실행하고 다른 스레드가 get()
또는 gerReference()
메서드를 같은 개체에서 동시에 실행하는 경우 compareAndSet()
메서드가 완료 될 때까지 get()
또는 gerReference()
메서드가 대기 (차단)됩니까?AtomicMarkableReference compareandset 메소드와 get 메소드의 동시 액세스
0
A
답변
0
사실 compareAndSet()
은 CAS operation (이름이 암시 함)이므로 비 블로킹이며 두 스레드가 동시에 호출 할 수 있지만 구현시 올바른 결과가 보장됩니다.
get()
과 getReference()
도 비 블로킹 작업 중 하나임을 의미합니다. 그들은 단지 추가적인 동기화없이 휘발성 필드의 값을 읽습니다.
0
compareAndSet() 메서드가 완료 될 때까지이 두 메서드 중 하나를 기다릴 수 없습니다. 소스 코드에서
봐는 :
public V getReference() {
return pair.reference;
}
public V get(boolean[] markHolder) {
Pair<V> pair = this.pair;
markHolder[0] = pair.mark;
return pair.reference;
}
public boolean compareAndSet(V expectedReference,
V newReference,
boolean expectedMark,
boolean newMark) {
Pair<V> current = pair;
return
expectedReference == current.reference &&
expectedMark == current.mark &&
((newReference == current.reference &&
newMark == current.mark) ||
casPair(current, Pair.of(newReference, newMark)));
}
private boolean casPair(Pair<V> cmp, Pair<V> val) {
return UNSAFE.compareAndSwapObject(this, pairOffset, cmp, val);
}
스레드를 차단 할 코드가 없습니다.
클래스의 the description of the package을 읽으십시오.
패키지 java.util.concurrent.atomic의 하나의 변수에 대한 잠금이없는 thread 세이프 인 프로그래밍을 지원하는 클래스의 소규모의 툴 킷입니다.
잠금없는 알고리즘입니다. 하지만 여전히 하드웨어에 따라 다를 수 있습니다.
[패키지 요약 JavaDocs] (https://docs.oracle.com/javase/7/docs/apc/java/util/concurrent/atomic/package-summary.html) 'java.util.concurrent'는 원자 클래스의 의미를 멋지게 설명합니다. 기본적으로 작업은 기본 하드웨어에 약간 의존하지만 비 블로킹입니다. –