|
SSISO Community검색 |
|
SSISO Community메뉴 |
|
SSISO Community카페 |
|
블로그 카테고리 |
|
|
Synchronized로 검색한 결과 |
|
등록일:2008-03-03 10:06:27 작성자: 제목:synchronized 에 대해 생각 해보자 |
|
1. Synchronized는 무엇을 지키고 있는 것일까?
공유되어 지는 필드가 복수의 쓰래드에서 동시에 접근 되지 않도록 지킨다.
그럼.. Synchronized된 메서드가 지키는 자원이 다른 곳에서도 잘지키고 있을까?
2. 어떤 단위로 지켜야 할까?
만약 두개의 필드를 Synchronized메서드가 지키고 있는데 그 두개의 필드에 각각 접근하는 메서드는 Synchronized 해도 소용없다..
※ 필드를 통합하여 지켜야 한다.
ex)
private String name = "Nobody";
private String address = "Nowhere";
public Synchronized void pass(String name, String address) {
this.counter++;
this.name = name;
this.address = address;
check();
}
public Synchronized String toString() {
return "No." + counter + ": " + name + ", " + address;
}
// 아래 메서드 들은 Synchronized 로 지키는 위의 메서드들을 무의미 하게 한다.
public Synchronized setName(String name) {
this.name = name;
}
public Synchronized setAddress(String address) {
this.address = address;
}
3. 어느 락을 사용해서 지키고 있는가?
Synchronized 한 인스턴스 메소드를 실행하는 쓰래드는 this의 락을 취해야 한다.
Synchronized (obj) {
....
}
락을 취해야 하는 인스턴스를 obj로 지정하고 있는데 이 인스턴스를 틀리지 않도록 주의해야 한다. 틀린 인스턴스의 락을 취하는 것은 자신의 집을 지키려고 하면서 옆집에 자물쇠를 잠그는 것과 같은것이다.
4. 극소의 조작
Synchronized 메소드는 동시에 하나의 쓰레드만이 실행할 수 있다. 하나의 쓰레드가 Synchronized 메소드를 사용하면 다른 쓰레드가 그 메소드에 들어갈 수 없다. Synchronized 가 행하고 있는 조작은 멀티 쓰레드 입장에서는 [분할 가능한 조작]이다. 이러한 분할 가능한 조작을 일반적으로 극소(atomic)의 조작 이라한다.
5. long 과 double은 극소로 다루어 지지 않는다. <= 자바 언어 사양에서
int, char 참조형에 대입하는 것은 극소이나 long과 double에 대한 대입은 극소가 아니다.
즉 멀티 쓰래드가 long값에 값을 대입 하면 읽을때 자신이 넣은 값인지 아닌지는 보장이 되지 않는다.
volatile 이라는 키워드를 사용하면 그 필드는 극소의 조작이 된다.
- 출처 : 자바 언어로 배우는 디자인 패턴 입문 [멀티쓰레드] 에 있는 내용을 정리함.
출처 [자바] Synchronized 에 대해 생각 해보자|작성자 래이도 |
|
|
|
|
|