AtomicInteger는 동기화를 처리합니까?

Aug 17 2020

두 스레드가 모두 i ++를int i 사용하여 동일하게 증가 하면 i ++ 는 원자 연산이 아니므 로 문제가 발생할 수 있습니다. 그것이 원자 증가를 만드는. 따라서 1 개의 코어와 2 개의 스레드가을 수행하는 경우 전혀 문제가 없을 수 있습니다 ( 작업 중에는 중단 할 수 없기 때문).AtomicInteger.increment().increment()

그러나 우리가 2 개의 코어와 2 개의 스레드를 가지고 있고 그들이 병렬로 (정확히 동시에) 그것을 호출한다면 increment()어떨까요?

동일한 값을로드 할 가능성이 int i있습니까? 경우 의미하는 것은 int i이었다 1 , 최종 결과는 것 아니라 3 . 이 경우 둘 다 동시에 같은 값을 취했기 때문에 원자 연산인지 상관하지 않습니다.

결론 : 동기화는 AtomicInteger에 의해 처리됩니까?

답변

3 Joni Aug 17 2020 at 12:04

동일한 값을로드 할 가능성이 int i있습니까?

예, 있습니다.하지만 귀하를 위해 처리됩니다.

incrementAndGet메서드는 증가 된 값을 설정하는 원자 적 "비교 및 설정"작업을 사용 하지만 새 값이 아직 설정되지 않은 경우에만 사용됩니다 . 비교에 실패 incrementAndGet하면 새 값을 가져 와서 다시 시도합니다.

순 효과는 incrementAndGet여러 스레드에서 사용하는 것이 안전하다는 것입니다 .