CAS ( Compare And Swap )


Atomic은 CAS 방식에 기반하여 동기화 문제를 해결한다.

CAS란 변수가 기존에 가지고 있던 값이 내가 예상하는 값과 일치하는 경우에만 새로운 값을 할당하는 것.

public class AtomicDemo {

    private int val;
    
    public boolean compareAndSwap(int oldVal, int newVal) {
        if (val == oldVal) {
           val = newVal;
           return true;
        }
        return false;
    }
}

 

간단하게, 값을 변경하기 전에 한번 더 확인해주는거라 보면됨.

Java에서 제공하는 Atomic Type은 이러한 CAS를 하드웨어(CPU)의 도움을 받아 한 번에 단 하나의 스레드만 변수의 값을 변경할 수 있도록 한다.

 

Java에서 지원하는 Atomic Type은 여러 가지가 있는데, 그 중 AtomicBoolean, AtomicInteger에 대해 정리해보자.

 

 

 

AtomicBoolean


AtomicBoolean도 결국 가질 수 있는 값은 true/false 두 개뿐.

AtomicBoolean이 제공하는 대표적인 두 가지 메서드를 살펴보자.

// 파라미터로 넘어온 expect 값과 동일한 경우에만 update로 값을 할당한다.
// 반환 값은 expect와 동일했다면 true, 동일하지않았다면 false
boolean compareAndSet(boolean expect, boolean update);

// 이전 값을 리턴하고, 새로운 값을 할당한다.
boolean getAndSet(boolean newValue);

 

위에서 예를 들었던 예를 AtomicBoolean을 이용하면 아래와 같이 변형할 수 있다.

public class AtomicDemo {
    
    private AtomicBoolean locked = new AtomicBoolean(false);
    
    public boolean lock() {
        return locked.compareAndSet(false, true);
    }
}

 

 

 

AtomicInteger


제공하는 모든 메서드에 대한 내용은 javadoc을 참고하기.

AtomicInteger도 위의 AtomicBoolean과 비슷하다. 다만, 제공하는 메서드가 조금 더 많다.

boolean compareAndSet(int expect, int update);
int getAndSet(int newValue);

// 값을 Atomic하게 1씩 증가시킨다.
int incrementAndGet();

// x만큼 값을 증가시킨다.
int accumulateAndGet(int x, IntBinaryOperator accumulatorFunction);

 

 

 

참고자료


 

[1] https://readystory.tistory.com/53

'Programming > Java' 카테고리의 다른 글

[Java] try-with-resources로 쉽게 자원해제하기  (0) 2020.04.17
[Java] NIO  (0) 2020.04.17
[Java] volatile 키워드  (0) 2020.04.13
[Java] synchronized 키워드  (0) 2020.04.13
[Java] @ 어노테이션  (0) 2020.03.31