2012-01-19 2 views
2

기본 클래스의 methode foo가 Synchronized (클래스 이름)를 사용하고, 기본 클래스를 확장하는 두 개의 클래스 A와 B가 있습니다. 두 인스턴스에서 인스턴스와 B 인스턴스의 foo를 호출하면 동기화됩니다. 다음은 샘플 코드입니다.은 클래스 이름에 의해 동기화됩니다. 함수는 확장 클래스에서 유효할까요?

class BaseClass { 
     void foo() { 
     synchronized(BaseClass.class) 
      // do something like increment count 
     } 
    } 


    class A extends BaseClass { 
    } 


    class B extends BaseClass { 
    } 

    A a = new A(); 
    B b = new B(); 
    //in thread 1 
    a.foo() ; 
    //in thread 2 
    b.foo() ; 

답변

5

은 예,이 의 모든 인스턴스가 모든 클래스 (자체 BaseClass 포함) BaseClass을 확장 를 통해 동기화됩니다. BaseClass.class 참조는 기본적으로 전체 클래스 로더에 대한 단일 참조입니다. 너 정말 그걸 원해?

일반적으로 동기화가 필요할 때 정적 메서드는 정적 인 항목과 동기화되어야하며 인스턴스 메서드는 인스턴스와 관련된 내용을 동기화해야합니다. 개인적으로 나는 this 또는 Class 참조에서 동기화하는 것을 싫어합니다. 두 참조가 다른 곳에서 사용 가능하므로 다른 코드가 동일한 모니터에서 동기화되어 동기화에 대해 추론하기가 어려울 수 있습니다. 대신, 내가 가진 경향이 :

public class Foo { 
    private final Object instanceLock = new Object(); 

    public void doSomething() { 
     synchronized (instanceLock) { 
      // Stuff 
     } 
    } 
} 

public class Bar { 
    private static final Object staticLock = new Object(); 

    public static void doSomething() { 
     synchronized (staticLock) { 
      // Stuff 
     } 
    } 
} 

(나는 일반적으로 실제로 단지 이름으로 lock을 사용, 난 그냥 선명도 여기가 더 명시했습니다.)

2

예, 동일한 작업을 수행하고 있습니다.

0

예. 스레드 실행 순서가 보장되지 않더라도 동기화됩니다.