Java

[Java] AtomicLong

bornsoon 2025. 6. 3. 12:40

 

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 없이도 정확한 값이 나옴.

 

 

 

자세한 글은 아래 블로그 글을 읽어보면 좋다!

https://jhost.tistory.com/103

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