2012-09-24 158 views
3

在調用plain()方法之前,同步sync()方法中的以下代碼塊。爲什麼會這樣呢,不應該只對同步方法調用內部鎖塊 - 例如,如果同時使用了plain(),這種行爲也會很好。同步方法執行時,非同步方法是否阻塞

由於java使用的監視器概念僅適用於同步的方法/塊 - 它的定義不應影響非同步代碼的執行。情況總是如此,或者這種行爲是特定於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

你應該叫start()而非run()在新線程。調用run()將在當前線程中執行可運行的方法run,而不是啓動一個新線程來運行它。

+0

哦天啊..我做了什麼..謝謝!! – haps10

+1

@ haps10它碰巧是我們最好的:-) – maba