스레드에 안전한 객체의 메서드를 조합하여 새로운 기능을 만들때 스레드 안전성이 깨질 수 있다.
public class UnsafeAtomic {
private final AtomicInteger num = new AtomicInteger(0);
public void setUpper(int n) {
if (num.get() > n) { // 원자적 연산 1
num.set(n); // 원자적 연산 2
}
}
}
AtomicInteger의 연산들은 스레드 안전하지만, 이들을 포함하여 만든 UnsafeAtomic.setUpper 는 원자적이지 않다.