AtomicInteger

요약 : 원자적 연산이란, 여러 스레드들이 병렬적으로 수행되어도 안전성을 보장받을 수 있는 것을 의미한다.
이러한 원자적 연산은 하드웨어적으로 접근해야지만 안전성을 보장받는다.
이러한 원자적 연산을 도와줄 수 있는 것이 AtomicInteger가 한 예이다.



* 원자적 연산을 수행할 수 있는 유용한 클래스이다.
Lock이나 synchronized 키워드 없이도 여러 스레드들에 의해 병렬적으로 수행되어도 결과의 안전성을 보장받을 수 있다면 그 연산은 원자적이라고 한다.


내부적으로 원자적 클래스들은 CAS(compare-and-swap)십분 활용한다.
간단히 설명하자면, 값을 변경할 때 자신이 읽었던 변수의 값을 기억하고 있다가 변경 직전에 변경직전에 변수의 메모리 내의 값을 확인하여 이전에 기억해 놓은 값과 같은 경우에만 처리를 진행하고 그렇지 않은 경우는 무산시키는 방식이다.
이러한 명령은 현대적 CPU에 의해 직접적으로 지원된다.(하드웨어적으로)
그래야 원자적 연산이 가능하다.
하드웨어 지원없이 완벽한 원자적 연산을 지원하는 것이 불가능하다.
따라서 요새는 CPU차원에서(하드웨어 차원에서) 이러한 연산을 지원하므로 특정 변수에 여러 스레드들이 동시에 접근하여 작업하는 경우가 있는 경우 이러한 원자적 연산을 이용하는 클래스를 이용하는 것이 권장된다.


예)

AtomicInteger atomInt = new AtomicInteger(0);

ExecutorService executor = Executors.newFixedThreadPool(2);

IntStream.range(0, 1000)
.forEach(i -> executor.submit(atomInt::incrementAndGet));

stop(executor)

System.out.println(atomInt.get(0);  ----> 1000


=====> Integer대신 AtomicInteger를 사용했을 뿐이다.
Integer는 스레드-안전하지 않으면 따라서 변수에 접근할 때 동기화를 신경써주지 않는다면 값의 안정적인 결고라르 보장 받을 수 없다.


댓글

이 블로그의 인기 게시물

(18장) WebSocekt과 STOMP를 사용하여 메시징하기

(네트워크)폴링방식 vs 롱 폴링방식

(ElasticSearch) 결과에서 순서 정렬