이 글은 원 저자 Jakob Jenkov의 허가로 포스팅된 번역물이다.

원문 URL : http://tutorials.jenkov.com/java-concurrency/thread-safety.html


 경합 조건은 다수의 쓰레드가 같은 자원에 접근하고 이 자원에 쓰기 작업을 시도할 때 발생한다. 만일 쓰레드들이 같은 자원에 접근하더라도 읽기 작업을 시도할 때는 경합 조건이 발생하지 않는다.


우리는 쓰레드들이 어떤 객체의 상태를 변경(update)할 수 없도록 함스로써 이 객체에게 불변성(immutability)을 부여할 수 있다. 그리고 이렇게 할 때 이 객체는 쓰레드 세이프하게 된다.


public class ImmutableValue{

  private int value = 0;

  public ImmutableValue(int value){
    this.value = value;
  }

  public int getValue(){
    return this.value;
  }
}


여기서 value가 어떤 방식으로 ImmutableValue 클래스의 생성자로 넘겨지는지 보고, 이 클래스에 setter 메소드가 없다는 점에 주목하자. 한 번 만들어진 ImmutableValue 인스턴스의 value 값은 변경될 수 없다. value 는 불변(immutable)한다. getValue() 메소드를 호출해서 이 값을 읽을 수는 있지만, 바꿀 수는 없다.


ImmutableValue 인스턴스의 value 에 다른 값을 주고자 한다면, 새로운 인스턴스를 생성하여 반환하는 방법으로 구현할 수는 있다.


public class ImmutableValue{

  private int value = 0;

  public ImmutableValue(int value){
    this.value = value;
  }

  public int getValue(){
    return this.value;
  }

  
      public ImmutableValue add(int valueToAdd){
      return new ImmutableValue(this.value + valueToAdd);
      }
  
}


add() 메소드는 기존 value 값에 다른 값을 더하며 새로운 ImmutableValue 인스턴스를 반환한다. 기존 인스턴스의 value 값은 변하지 않는다.



참조는 쓰레드 세이프하지 않다!


한 객체가 불변하고 쓰레드 세이프하다 하더라도, 이 객체로의 참조는 쓰레드 세이프하지 않을 수 있다는 점을 기억해야 한다. 예제를 보자.


public class Calculator{
  private ImmutableValue currentValue = null;

  public ImmutableValue getValue(){
    return currentValue;
  }

  public void setValue(ImmutableValue newValue){
    this.currentValue = newValue;
  }

  public void add(int newValue){
    this.currentValue = this.currentValue.add(newValue);
  }
}


Calculator 클래스는 ImmutableValue 인스턴스의 참조를 지닌다. 이 클래스가 setValue()와 add() 메소드를 통해 어떻게 ImmutableValue 인스턴스의 값을 변경하는지 보자. 이렇게 Calculator 클래스가 내부적으로 불변하는 객체를 사용한다 하더라도, 여기에 불변성은 존재하지 않으며, 쓰레드 세이프하지 않다. 


다시 말해서, ImmutableValue 클래스는 쓰레드 세이프하다. 하지만 이 클래스의 사용은 쓰레드 세이프하지 않다. 이것은 불변성을 이용하여 쓰레드의 안정성을 구현하려 할 때 기억해야 할 사실이다. 


여기서 Calculator 클래스를 쓰레드 세이프하게 만들기 위해서는 getValue(), setValue(), add() 메소드에 synchronized 를 사용하는 방법이 있다.



+ Recent posts