2014-12-14 9 views
0

튜토리얼에서이 코드를 보았습니다. 다음 코드에 문제가 있는지 물어 보았습니다. 나에게 그것은 a()가 이미 모니터를 제어하고 있기 때문에 b()에 액세스 할 수없는 것처럼 보였다. 내가 그렇게 생각하고 있니?동기화 된 키워드로 Java 잠금

public class Test { 
    public synchronized void a() { 
     b(); 
     System.out.println("I am at a"); 
    } 
    public synchronized void b() { 
     System.out.println("I am at b"); 
    } 
} 
+0

누군가가 설명없이 이것을 투표 했습니까? 나는 답을 모른다. 설명해 주겠다. ?? – thonnor

+0

나는 downvote에 대한 이유를 모르지만, OP는 단지 그것을 시도하지 않은 것 같습니다. – chrylis

답변

3

아니요, 해당 코드에는 아무런 문제가 없습니다. 참고 두 가지 :

  1. synchronized SomeType foo() { ... } 그것은 바깥 쪽 클래스의 this 인스턴스를 고정

    SomeType foo() { 
        synchronized (this) { ... } 
    } 
    

    에 해당합니다. 그래서, 귀하의 경우에 a()b()은 동일한 것을 잠그고 있습니다

  2. 스레드가 이미 일부 객체의 모니터에 잠금을 유지하고 있으면 다른 스레드가 동일한 객체에 대한 잠금을 획득하는 것을 방지하지만 동일한 스레드가 필요하다면 더 많은 자물쇠가 있어도 영향을받지 않습니다. 스레드가 a() 내부에 있지만 그래서

    public synchronized void a() { // acquires lock on this 
        b();       // also aquires lock on this, but it's ok because it is the same thread 
        System.out.println("I am at a"); 
    }  
    

    는 다른 스레드가 동일한 인스턴스에 a() 또는 b() 중 하나를 호출 할 수 없습니다. 시도 할 경우 현재 스레드가 a()을 종료 할 때까지 기다려야합니다. 다만, 현재의 thread 자체는 영향을받지 않습니다. 이미 락을 보관하고 있기 (위해) 때문에,이 객체의 동기 메소드를 호출 할 수가 있습니다.

0

아니요, 틀 렸습니다. 스레드은 메서드가 아닌 모니터를 제어하므로 필요에 따라 동일한 개체에 동기화 된 메서드를 여러 번 실행할 수 있습니다.