이것은 자동 증가 연산입니다. 정의: CAS에는 3개의 피연산자, 메모리 값 V, 이전 예상 값 A, 수정될 새 값 B가 있습니다. 기대값 A와 메모리 값 V가 같은 경우에만 메모리 값 V를 B로 수정하고, 그렇지 않으면 아무것도 하지 마세요
다음은 기대값인가요? 메모리 값이 현재입니까?
스레드가 증가할 때 다른 스레드와 경쟁이 없으면 예상 값은 메모리 값보다 1 커야 합니다. 왜 예상 값과 메모리 값이 같나요?
怪我咯2017-06-28 09:26:31
하제~
작성자의 질문 이해가 좀 잘못된거 아닐까요
current는 메모리 값이 아니라 예상 값입니다
다음은 기대값이 아닌 수정된 새 값입니다
methodcompareAndSet
의 소스 코드를 볼 수 있으며, 내부 설명도 매우 명확합니다
CAS의 작동은 질문자가 언급한 바와 같습니다. 예상 값과 메모리 값을 비교합니다. 그렇지 않으면 계속 재시도합니다. 실제 메모리 값 사실은 AtomicInteger.value
这个属性(其实最关键也不是这个属性,只是个引用而已,真正的boss后面会提到),注意这个value的有关键字volatile
수정
그래서 이 값은 실제로 이 변수의 가시성, 즉 스레드 간의 가시성을 나타내는 공유 변수입니다.
======================== 가시성에 대해 너무 많이 이야기하고 있으니 마음에 들지 않으면 건너뛰셔도 됩니다 === ======== =====================
간단히 말하면, Java 메모리 모델은 변수가 메인 메모리(물리적 메모리와 유사)에 저장된다고 규정합니다. 각 스레드는 특정 변수에 대해 작업을 수행할 때 메인 메모리의 값이 직접 수정되지 않습니다. , 하지만 자신의 작업 캐시에서 실행되어 최종적으로 메인 메모리에 동기화되며 스레드는 서로의 작업 캐시에 접근할 수 없습니다
여기서 언급하는 가시성이란 스레드가 volatile
키워드로 수정된 변수를 조작할 때 해당 변수가 성공적으로 수정되어 메인 메모리에 기록되면 다른 스레드의 작업 캐시에 있는 변수가 유효하지 않게 된다는 것을 의미합니다. 변수를 다시 읽으면 자체 작업 캐시에 있는 값을 사용하는 대신 주 메모리에서 직접 읽습니다
====================================================== ==========================================
방금 AtomicInteger.value
속성은 데이터 자체에 대한 참조일 뿐이라고 언급했습니다. AtomicInteger.value
这个属性对于数据本身而言,只是一个引用,在调用compareAndSet
方法时,可以注意到第二个参数,valueOffset
,其实这才是关键...真正的Boss,真正的内存的值,因为涉及到在java语言里很少听到的一个词,指针,这个valueOffset
메서드를 호출하면 실제로 두 번째 매개변수인 valueOffset
를 확인할 수 있습니다. 이것이 핵심입니다. 실제 Boss, 실제 메모리 값입니다. Java 언어에서 거의 들어보지 못한 단어인 포인터, 이 valueOffset
가 포함되어 있기 때문입니다. 이것은 객체 내의 오프셋입니다. 이것은 실제 메모리 값입니다
(이 메서드 compareAndSet
里调用的是Unsafe
类的方法,Unsafe
가 Unsafe
클래스의 메서드를 호출하는 이유는 Unsafe
가 실제로 포인터와 유사한 일부 작업을 캡슐화하므로 포인터가 안전하지 않기 때문입니다)