synchronized(xxxxx.Class)
Class Sample {
int x;
double y;
String s;
public void func() {
synchronized(Sample.class) { ... }
}
}
Sample a = new Sample(), b = new Sample(), c = new Sample();
클래스
의 메서드를 호출한 a.func() 가 몸체 내의 블록으로 인해 Sample.class 에 대한 락을 지니고 있기 때문주의
: a.func() 호출 시 Sample.class 자체에 락이 걸리기 때문에 인스턴스 b 는 func() 메서드 외에도 Sample 클래스에 정의된 다른 자원에 접근할 수 없다.synchronized(this) { ... }
Composition 관계일 때는 synchronized(참조 변수 이름) { ... }
Class Sample {
int x;
double y;
String s;
public void func() {
synchronized(this) { ... }
}
}
Sample a = new Sample(), b = new Sample(), c = new Sample();
주의
: 현재 자원을 할당 받은 스레드에서 객체 b는 b.func() 외에도 자신의 인스턴스 변수와 메서드에 접근할 수 있지만 a.func() 가 아직 종료되지 않은 상황이므로 현재 스레드는 a.func() 외에도 a 의 어떠한 인스턴스 변수, 메서드에도 접근할 수 없다.Class Sample {
public synchronized void func() {
}
}
객체 내에서 해당 메서드 단위로 락이 걸림.