0

Java의 의 compareAndSet() 메소드가 원자 적으로 작동합니다. 따라서 동일한 객체에서 동시에 두 가지 메소드를 실행할 수는 없습니다. 그러나 스레드 중 하나가 compareAndSet() 메서드를 실행하고 다른 스레드가 get() 또는 gerReference() 메서드를 같은 개체에서 동시에 실행하는 경우 compareAndSet() 메서드가 완료 될 때까지 get() 또는 gerReference() 메서드가 대기 (차단)됩니까?AtomicMarkableReference compareandset 메소드와 get 메소드의 동시 액세스

+0

[패키지 요약 JavaDocs] (https://docs.oracle.com/javase/7/docs/apc/java/util/concurrent/atomic/package-summary.html) 'java.util.concurrent'는 원자 클래스의 의미를 멋지게 설명합니다. 기본적으로 작업은 기본 하드웨어에 약간 의존하지만 비 블로킹입니다. –

답변

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 세이프 인 프로그래밍을 지원하는 클래스의 소규모의 툴 킷입니다.

잠금없는 알고리즘입니다. 하지만 여전히 하드웨어에 따라 다를 수 있습니다.