[Java] Atomic Type
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);
참고자료
'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 |
댓글
이 글 공유하기
다른 글
-
[Java] try-with-resources로 쉽게 자원해제하기
[Java] try-with-resources로 쉽게 자원해제하기
2020.04.17 -
[Java] NIO
[Java] NIO
2020.04.17 -
[Java] volatile 키워드
[Java] volatile 키워드
2020.04.13 -
[Java] synchronized 키워드
[Java] synchronized 키워드
2020.04.13