불변객체란
불변 객체란, 생성된 후 그 상태를 변경할 수 없는 객체를 의미합니다. 이러한 불변 객체의 대표적인 예로 자바에서는 String과 Integer 등이 있습니다.
참조 변수는 Thread-Safe하지 않다
불변 객체는 그 상태가 변하지 않기 때문에 여러 스레드에서 동시에 해당 객체를 참조하더라도 동시성 문제가 발생하지 않을 것처럼 보입니다. 하지만 실제로는 참조하는 변수의 동시성 문제로 인해 예상치 못한 동작을 할 수 있습니다.
예시로 불변객체인 Integer 값을 증가시키려는 시도를 했을때, race condition이 발생하는 것을 알 수 있습니다.
public class CountingTest {
public static void main(String[] args) {
Count count = new Count();
for (int i = 0; i < 100; i++) {
new Thread(){
public void run(){
for (int j = 0; j < 100; j++) {
count.increment();
System.out.println(count.getCount());
}
}
}.start();
}
}
}
class Count {
private Integer count = 0;
public void increment() {
count = count + 1;
}
public Integer getCount() { return count; }
}
결론
불변하게 만들어진 클래스의 인스턴스 자체는 Thread-Safe 하지만, 그 인스턴스를 사용하는 참조 변수는 Thread-Safe하지 않기 때문에 불변 객체를 사용할때 주의 해야 합니다. 또한, 위 코드는 테스트를 위해 작성하였지만, 실제 상황에서 불변객체를 사용해서 이렇게 변경이 많이 일어나는 코드를 짜게 된다면, 변경 때마다 객체를 생성하기 때문에 GC에 오버헤드가 발생할 수 있습니다.
'Language > Java' 카테고리의 다른 글
Syncronized와 Atomic 비교 (0) | 2024.01.01 |
---|---|
Java ArrayList의 동작원리 (0) | 2023.12.18 |