https://docs.oracle.com/javase/tutorial/essential/concurrency/atomic.html
프로그래밍에서 atomic 동작은 모든 동작을 한번(한큐)에 수행한다는 것을 의미한다. Atomic 동작은 중간에 멈출수 없다. 한번에 완전히 일어나거나 전혀 일어나지 않는다. atomic 동작이 완료될때 까지 atomic 동작에 대한 부작용은 없다.
간단한 표현식이라 할지라도 여러 연산의 조합으로 이루어질 수 있다. 그러나 아래의 동작들은 원자적으로 지정할수 있다.
즉, 스레드 간섭을 신경쓰지 않고 사용할수 있다. 그러나 메모리 일관성 오류는 여전히 존재하기 때문에 atomic 동작은 적절히 동기화 시켜줘야한다. volatile 변수에 대한 쓰기작업은 뒤따르는 읽기 작업보다 먼저 실행된다는 순서가 보장되기 때문에 메모리 일관성 오류의 위험이 줄어든다.
이 말은 volatile 변수에 대한 변경사항은 항상 다른 스레드들이 볼수 있다는 것을 의미한다. 더 나아가 한 스레드가 volatile 변수를 읽으려고 할때, volatile 변수의 최신 변경사항 뿐만 아니라 변경을 하는 코드의 부작용도 볼 수 있다는 뜻이다.
동기화된 코드를 통해 변수에 접근하는 것보다 volatile 변수에 접근하는 것은 더욱 효율적이지만 메모리 일관성 오류는 피하려면 더 많은 주의와 노력이 필요하다. 추가적인 노력은 어플리케이션의 복잡도와 크기에 따라 달라진다.
java.util.concurrent 패키지에 있는 클래스들은 동기화에 의존하지 않은 atomic 방법들을 제공한다.