문제

문서에 따르면 AtomicReference.compareAndSet() 메서드에 대해 몇 가지 질문이 있습니다.

현재 값 == 예상 값인 경우 값을 지정된 업데이트 값으로 원자적으로 설정합니다.

내가 이해하는 한, == 연산자는 두 개체의 주소를 비교합니다. 그렇다면 다음과 같은 예에서는 어떻게 작동합니까?

private AtomicReference<AccessStatistics> stats =
    new AtomicReference<AccessStatistics>(new AccessStatistics(0, 0));
public void incrementPageCount(boolean wasError) {
    AccessStatistics prev, newValue;
    do {
        prev = stats.get();
        int noPages = prev.getNoPages() + 1;
        int noErrors = prev.getNoErrors;
        if (wasError) {
           noErrors++;
        }
        newValue = new AccessStatistics(noPages, noErrors);
    } while (!stats.compareAndSet(prev, newValue));
}

이 코드 조각에서 jvm은 어떤 필드를 알고 있는지 어떻게 알 수 있습니까? AccessStatistics 에서 비교하게 된다. compareAndSet()?사실 저는 Java가 재정의를 허용하지 않는 경우 이 전체 전략이 어떻게 작동하는지 궁금합니다. == 조금도?어떤 의견이라도 보내주셔서 감사합니다!

도움이 되었습니까?

해결책

JVM은 CompareAndSet()에서 비교할 AccessStatistics의 어떤 필드를 어떻게 알 수 있나요?

그렇지 않습니다.객체의 필드를 비교하지 않습니다.단지 비교하는 것 뿐이다. 참조 문서에 나와 있는 객체의 내용입니다.그게 바로 그 방법이야 AtomicReference 수업 작품.에서 언급했듯이 javadocs, 그것은 사용 == 그리고는 아니다 equals() 방법.

현재 값 == 예상 값인 경우 값을 지정된 업데이트 값으로 원자적으로 설정합니다.

모든 Atomic* 클래스는 비슷한 기능을 가지고 있습니다.이를 통해 다른 스레드가 값을 덮어쓰지 않도록 하면서 값을 원자적으로 설정할 수 있습니다.와 함께 compareAndSet(...) 예상대로 업데이트되도록 하려면 현재 개체 참조를 지정해야 합니다.

코드 조각에서는 변경 불가능한 액세스 통계 개체에 추가하려고 합니다.따라서 현재 값을 가져와 여기에 추가한 다음 새 통계를 참조에 저장합니다.다른 스레드가 저장된 경우 그것은 그 시간 사이의 통계, 그 다음에는 compareAndSet false를 반환하고 루프를 돌며 다시 시도합니다.이렇게 하면 경쟁 조건이 없어도 문제가 해결됩니다. synchronized 차단하다.

다른 팁

JVM은 필드를 전혀 비교하지 않습니다.그것 단지 동일한 참조인지, 메모리의 동일한 포인터인지 또는 무엇이라고 부르고 싶은지 비교합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top