AtomicLong (java.util.concurrent.atomic.AtomiLong)
멀티스레드 환경에서 안전하게 Long 값을 다룰 수 있도록 해주는 Wrapper 클래스
원자적 연산을 제공해준다.
AtomicLong은 여러 스레드가 동시에 값을 읽고 변경할 때,
동기화 없이도 안전하게 값을 조작할 수 있도록 만들어졌다.
내부적으로는 CPU의 CAS(Compare-And-Swap) 명령어를 이용해 원자성 보장.
언제 사용하는지?
- 멀티스레드 환경에서 카운팅, 인덱싱, 유일한 ID 생성 등
- synchronized 키워드보다 더 나은 성능이 필요한 경우
- volatile보다 더 복잡한 상태 변경이 필요한 경우
주요 메서드
get() | 현재 값을 반환 |
set(long newValue) | 값을 강제로 설정 |
getAndSet(long newValue) | 현재 값을 반환하고 새 값으로 설정 |
incrementAndGet() | 1 증가한 값을 반환 |
getAndIncrement() | 현재 값을 반환한 후 1 증가 |
decrementAndGet() | 1 감소한 값을 반환 |
addAndGet(long delta) | delta만큼 더하고 결과 반환 |
compareAndSet(expect, update) | 기대한 값이면 업데이트 (CAS 연산) |
<예제>
import java.util.concurrent.atomic.AtomicLong;
public class CounterApp {
private static AtomicLong counter = new AtomicLong(0);
public static void main(String[] args) throws InterruptedException {
Runnable task = () -> {
for (int i = 0; i < 1000; i++) {
counter.incrementAndGet();
}
};
Thread t1 = new Thread(task);
Thread t2 = new Thread(task);
t1.start(); t2.start();
t1.join(); t2.join();
System.out.println("최종 카운터 값: " + counter.get()); // 2000 예상
}
}
// AtomicLong 덕분에 synchronized 없이도 정확한 값이 나옴.
자세한 글은 아래 블로그 글을 읽어보면 좋다!
728x90
'Java' 카테고리의 다른 글
[Java] Iterator와 ListIterator (1) | 2025.06.07 |
---|---|
[Spring] @AfterEach, @BeforeEach (0) | 2025.06.03 |
[Java] ConcurrentHashMap (0) | 2025.06.03 |
[Java] split와 정규식 (0) | 2025.05.31 |
[Java] next() & nextLine() (0) | 2025.05.27 |