2012-09-24 111 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