boolean, int 등과 같은 값에 대해 synchronized를 이용하여 동기화가 필요할 때가 있다. 이 경우 별도의 모니터 객체를 만들거나 해당 값을 멤버변수로 가지고 있는 객체에 대해 synchronized를 처리하면 되지만 해당 객체에 대해서 동기화를 해야 할 경우가 있다.
예를 들면 multi thread하에서 wati(), notifyAll() 등을 이용해야 하는 경우이다. boolean, int 등과 같은 primitive data type에 대해서는 synchronized를 할 수 없기 때문에 Boolean, Integer 등을 사용하면 가능하다. 하지만 여기에 한가지 함정이 있다.

Boolean flag = false;

public void test1() {
    synchronized(flag) {
        while(!flag) {
            flag.wait();
        }
    }
}

public void test2() {
    synchronized(flag) {
        flag = true;
        flag.notifyAll();
    }
}

이런 코드를 만들 수 있는데 여기서 test2() 메소드에서 flag = true 라고 하는 순간 새로운 객체가 생성되어 flag에 할당된다. 그러면 flag.notifyAll() 에서는 새로 만들어진 객체에 대해서 lock을 가지고 있지 않기 때문에 Exception이 발생한다.
Boolean 등과 같은 클래스에 대해 boxing, unboxing을 자바가 자동으로 해주기 때문에 개발자는 이런점을 놓치기 쉽다. 해결 방법은 MutableBoolean 클래스를 만들면 된다.

public class MutableBoolean {

  private boolean value;

  public MutableBoolean(boolean value) {

    this.value = value;

  }

  public void setValue(boolean value) {

    this.value =value;

  }

  public boolean isTrue() {

    return value;

  }

  public String toString() {

    return String.valueOf(value);

  }

  public boolean equals(Object obj) {

    return value == ((MutableBoolean)obj).value;

  }

}

 




크리에이티브 커먼즈 라이센스
Creative Commons License

Posted by 김형준


Trackback URL : http://www.jaso.co.kr/trackback/175

Comments List

  1. typos 2007/07/05 01:28 # M/D Reply Permalink

    자바는 참 이해하기 힘든 오묘한 언어입니다. ㅎㅎ

Leave a comment
« Previous : 1 : ... 247 : 248 : 249 : 250 : 251 : 252 : 253 : 254 : 255 : ... 388 : Next »