Java

Atomic 자료형

Dean83 2025. 12. 12. 14:05

비동기 처리를 할 때, 기본 자료형의 경우 데이터가 꼬일 가능성이 있다. 이를 막기 위해서 lock을 거는 등 별도의 처리를 해주어야 하는데, 

 

Java 에서는 Atomic 자료형을 제공해 주어, 멀티스레드 환경에서 안전하게 값을 읽고 쓸 수 있다. 

 

제공하는 메서드를 보면, 

  • get() — 값 읽기
  • set() — 값 쓰기
  • getAndIncrement()
  • incrementAndGet()
  • addAndGet(n)
  • compareAndSet(expect, update)
    • 동시성 문제를 해결하는 주요 기능이다.
    • 현재값이 내가 예상한 값과 같으면 새값으로 바꾸고, 그렇지 않으면 아무것도 하지 않는다.
    • 예를들어, 내가 알고 있던 값이 100 이고, 이것을 101로 바꾸려 할때, 누군가 102로 바꿨다면 아무것도 하지 않고, 100 이라면 내가 변경 하려는 값으로 바꾼다. 
    • 낙관적 락의 version과 비슷한 느낌이 난다.

지원 자료형을 살펴 보면 다음과 같다. 

 

(1) 숫자형 Atomic 클래스

  • AtomicInteger
  • AtomicLong
  • AtomicDouble(Guava 제공, JDK는 없음)
  • AtomicIntegerArray
  • AtomicLongArray

 

(2) 참조형 Atomic 클래스

 

  • AtomicReference<T>
  • AtomicReferenceArray<T>

 

(3) Special Atomics

 

  • AtomicBoolean
  • AtomicStampedReference<T>
  • (ABA 문제 해결용: 값 + 버전 스탬프)
  • AtomicMarkableReference<T>
  • (boolean mark를 함께 저장)

 

(4) Adder/Accumulator (Java 8)

 

  • LongAdder
  • LongAccumulator

 

사용 예는 다음과 같다. 

AtomicInteger count = new AtomicInteger(0);

public void increment() {
    count.incrementAndGet(); // thread-safe
}

 

CAS의 경우 다음과 같다.

AtomicInteger value = new AtomicInteger(0);

public void update() {
    int prev;
    do {
        prev = value.get(); // 현재 값 읽기
    } while (!value.compareAndSet(prev, prev + 1)); 
}

'Java' 카테고리의 다른 글

Optional.ofNullable 로 null-safe 처리 하기  (0) 2025.11.04
파일 쓰고, 읽기 예제  (0) 2025.10.02
Checked, Unchecked Exception  (0) 2025.10.01
Stream API  (0) 2025.09.10
Java Collections Framework (List, Map...)  (0) 2025.09.10