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