>  Q&A  >  본문

AtomicInteger의 CAS 문제

으아아아

이것은 자동 증가 연산입니다. 정의: CAS에는 3개의 피연산자, 메모리 값 V, 이전 예상 값 A, 수정될 새 값 B가 있습니다. 기대값 A와 메모리 값 V가 같은 경우에만 메모리 값 V를 B로 수정하고, 그렇지 않으면 아무것도 하지 마세요
다음은 기대값인가요? 메모리 값이 현재입니까?
스레드가 증가할 때 다른 스레드와 경쟁이 없으면 예상 값은 메모리 값보다 1 커야 합니다. 왜 예상 값과 메모리 값이 같나요?

我想大声告诉你我想大声告诉你2642일 전744

모든 응답(1)나는 대답할 것이다

  • 怪我咯

    怪我咯2017-06-28 09:26:31

    하제~
    작성자의 질문 이해가 좀 잘못된거 아닐까요

    1. current는 메모리 값이 아니라 예상 값입니다

    2. 다음은 기대값이 아닌 수정된 새 값입니다

    methodcompareAndSet의 소스 코드를 볼 수 있으며, 내부 설명도 매우 명확합니다

    으아악

    CAS의 작동은 질문자가 언급한 바와 같습니다. 예상 값과 메모리 값을 비교합니다. 그렇지 않으면 계속 재시도합니다. 실제 메모리 값 사실은 AtomicInteger.value这个属性(其实最关键也不是这个属性,只是个引用而已,真正的boss后面会提到),注意这个value的有关键字volatile수정

    입니다 으아악

    그래서 이 값은 실제로 이 변수의 가시성, 즉 스레드 간의 가시성을 나타내는 공유 변수입니다.

    ======================== 가시성에 대해 너무 많이 이야기하고 있으니 마음에 들지 않으면 건너뛰셔도 됩니다 === ======== =====================

    간단히 말하면, Java 메모리 모델은 변수가 메인 메모리(물리적 메모리와 유사)에 저장된다고 규정합니다. 각 스레드는 특정 변수에 대해 작업을 수행할 때 메인 메모리의 값이 직접 수정되지 않습니다. , 하지만 자신의 작업 캐시에서 실행되어 최종적으로 메인 메모리에 동기화되며 스레드는 서로의 작업 캐시에 접근할 수 없습니다

    여기서 언급하는 가시성이란 스레드가 volatile 키워드로 수정된 변수를 조작할 때 해당 변수가 성공적으로 수정되어 메인 메모리에 기록되면 다른 스레드의 작업 캐시에 있는 변수가 유효하지 않게 된다는 것을 의미합니다. 변수를 다시 읽으면 자체 작업 캐시에 있는 값을 사용하는 대신 주 메모리에서 직접 읽습니다

    ====================================================== ==========================================

    방금 AtomicInteger.value 속성은 데이터 자체에 대한 참조일 뿐이라고 언급했습니다. AtomicInteger.value这个属性对于数据本身而言,只是一个引用,在调用compareAndSet方法时,可以注意到第二个参数,valueOffset,其实这才是关键...真正的Boss,真正的内存的值,因为涉及到在java语言里很少听到的一个词,指针,这个valueOffset 메서드를 호출하면 실제로 두 번째 매개변수인 valueOffset를 확인할 수 있습니다. 이것이 핵심입니다. 실제 Boss, 실제 메모리 값입니다. Java 언어에서 거의 들어보지 못한 단어인 포인터, 이 valueOffset가 포함되어 있기 때문입니다. 이것은 객체 내의 오프셋입니다. 이것은 실제 메모리 값입니다

    (이 메서드 compareAndSet里调用的是Unsafe类的方法,UnsafeUnsafe 클래스의 메서드를 호출하는 이유는 Unsafe가 실제로 포인터와 유사한 일부 작업을 캡슐화하므로 포인터가 안전하지 않기 때문입니다)

    회신하다
    0
  • 취소회신하다