질문자가 말했듯이 AtomicInteger 소스 코드는 스레드 안전성을 달성하기 위해 Integer을 비교하고 대체합니다. 그리고 AtomicReference은 객체 참조와 비교 및 대체입니다. 이는 원자 클래스 CAS 구현입니다.
주소를 비교할 것인지는 질문자가 말한 것부터 시작하여 AtomicReference 다음 방법을 알아 두십시오.
으아악
기본 구현은 Unsafe 로컬 메서드인 native 클래스에 있습니다. Unsafe의 CAS에는 읽고 쓸 메모리 위치 valueOffset, 비교할 값 expected, 쓸 새 값 update이라는 세 개의 피연산자가 포함됩니다. CAS는 메모리 위치 V에 저장된 값이 비교된 값 A와 동일한 경우에만 메모리 주소의 이전 값을 새 값으로 원자적으로 업데이트합니다. 그렇지 않으면 작업이 수행되지 않습니다.
핵심은 들어오는 valueOffset의 역할에 있습니다. 계속해서 AtomicReference 소스 코드를 확인하세요:
으아악
여기서 unsafe의 objectFieldOffset 메소드는 객체의 메모리 오프셋을 구하는 것인데, 즉 여기서 비교를 통해 동일한 객체 주소인지 판단할 수 있다.
은 주소입니다. 정확히 말하면 이 객체의 메모리 값 Offset 위치를
과 비교합니다.안전하지 않은 자세한 설명
질문자가 말했듯이
AtomicInteger
소스 코드는 스레드 안전성을 달성하기 위해Integer
을 비교하고 대체합니다. 그리고AtomicReference
은 객체 참조와 비교 및 대체입니다. 이는 원자 클래스 CAS 구현입니다.주소를 비교할 것인지는 질문자가 말한 것부터 시작하여
으아악AtomicReference
다음 방법을 알아 두십시오.기본 구현은
Unsafe
로컬 메서드인native
클래스에 있습니다.Unsafe
의 CAS에는 읽고 쓸 메모리 위치valueOffset
, 비교할 값expected
, 쓸 새 값update
이라는 세 개의 피연산자가 포함됩니다. CAS는 메모리 위치 V에 저장된 값이 비교된 값 A와 동일한 경우에만 메모리 주소의 이전 값을 새 값으로 원자적으로 업데이트합니다. 그렇지 않으면 작업이 수행되지 않습니다.핵심은 들어오는
으아악valueOffset
의 역할에 있습니다. 계속해서AtomicReference
소스 코드를 확인하세요:여기서
unsafe
의objectFieldOffset
메소드는 객체의 메모리 오프셋을 구하는 것인데, 즉 여기서 비교를 통해 동일한 객체 주소인지 판단할 수 있다.결론: