비동기 처리를 할 때, 기본 자료형의 경우 데이터가 꼬일 가능성이 있다. 이를 막기 위해서 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 |