2012-09-24 2 views
3

다음 코드는 plain() 메서드를 호출하기 전에 동기화 된 sync() 메서드에서 차단됩니다. 이것이 왜 그렇게, intrinsic lock 블록이 동기화 된 메소드만을 호출해서는 안된다. 예를 들어 plain()이 동기화되어 있다면이 동작은 괜찮을 것이다.동기화 된 메서드가 실행될 때 블록을 동기화하지 않음

자바가 사용하는 모니터 개념은 동기화 된 메소드/블록에만 적용됩니다. 정의에 따라 동기화되지 않은 코드의 실행에는 영향을 미치지 않아야합니다. 이것이 항상 사실입니까, 아니면이 동작 JVM 구현과 관련이 있습니다.

public class Main { 

    public static void main(final String[] args) { 
     final Main main = new Main(); 
     new Thread(new Runnable() { 
      @Override 
      public void run() { 
       main.sync(); 
      } 
     }).run(); 
     main.plain(); 
    } 

    public synchronized void sync() { 
     try { 
      System.out.println("sleeping..."); 
      Thread.sleep(2000); 
      System.out.println("out..."); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
    } 

    public void plain() { 
     System.out.println("plain..."); 
    } 
} 

출력 :

sleeping... 
out... 
plain... 

답변

8

당신은 새로운 Thread에 start()보다는 run() 호출해야합니다. run()을 호출하면 새로운 스레드를 시작하지 않고 현재 스레드에서 실행 가능한 run 메서드를 실행합니다.

+0

오 하나님 ... 내가 뭘 했지 .. 감사합니다 !! – haps10

+1

@ haps10 우리에게 가장 좋은 일이 생깁니다 :-) – maba

관련 문제