2013-03-21 2 views
2

동기화 된 메서드와 정적 동기화 된 메서드의 주된 차이점을 이해하려고합니다.동기화 및 정적 동기화

예를 들어 Employee 클래스를 고려하면 두 개의 인스턴스가 e1, e2 인 클래스를 고려하십시오.

synchronized method1() { 
    //--- blah blah--- 
} 

e1 오브젝트 레벨 잠금을 획득함으로써 method1()를 실행

e2e1 의해 hwld 하였다 해제 될 로크를 기다리는 것이다.

클래스 수준에서 잠금을 보유하는 e1을 정적으로 동기화하는 경우 e2은 해당 블록을 입력 할 수 없습니다.

static synchronized method1() { 
    //--- blah blah--- 
} 

두 경우는 어떻게 다른가요? 정적 및 비 정적 동기화 된 메서드 액세스 간의 차이점을 보지 못했습니다.

답변

2

첫 번째 예에서는 동기화가 인스턴스 수준에서 작동하므로 e1.method1()e2.method1()을 동시에 호출하면 동기화가 병렬로 실행될 수 있습니다.

두 번째 예에서는 동기화가 클래스 수준에서 수행되므로 e1.method1()e2.method1()을 동시에 호출하면 동기화가 병렬로 실행되지 않습니다.

+0

첫 번째 예에서 e1과 e2가 모두 병렬로 실행될 수 있습니까? 동기화 된 개념과 모순되지 않습니까? –

+0

@BalajiG 확실한가요? 예/모순입니까 : 아니요. 첫 번째 예제는'void method1() {synchronized (this) {...}} '와 같습니다. 그래서 만약 당신이'e1.method1(); e2.method1(); 그들은 각각'e1'과'e2'를 잠글 것입니다. 이들은 서로 다른 잠금 장치이므로 서로 배타적이지 않습니다. – assylias

+0

두 번째 예제는'static void method1() {synchronized (MyClass.class) {...}}'와 동일합니다. - 모든 인스턴스 ('Myclass.class')와 모든 호출 상호 배타적입니다. – assylias