2011-10-05 65 views
7

我在同一個文件中有以下程序。我已經同步了run()方法。爲什麼同步方法允許多個線程同時運行?

class MyThread2 implements Runnable { 
    Thread t; 

    MyThread2(String s) { 
     t=new Thread(this,s); 
     t.start(); 
    } 

    public synchronized void run() { 
     for (int i=0;i<3;i++) { 
      System.out.println("Thread name : "+ Thread.currentThread).getName()); 
      try { 
       t.sleep(1000); 
      } 
      catch (InterruptedException e) { 
       e.getMessage(); 
      } 
     } 
    } 
} 

class TestSync { 
    public static void main(String[] args) { 
     MyThread2 m1=new MyThread2("My Thread 1"); 
     c.fun(); 
    } 
} 

class c { 
    static void fun() { 
     MyThread2 m1=new MyThread2("My Thread 4"); 
    } 
} 

輸出

Thread name : My Thread 1 
Thread name : My Thread 4 
Thread name : My Thread 4 
Thread name : My Thread 1 
Thread name : My Thread 1 
Thread name : My Thread 4 

我的問題是,爲什麼是同步的方法,同時允許「我的線程1」和「我的主題4」線程同時訪問?

+2

您發佈的代碼至少有一個語法錯誤,而且很難按原樣閱讀。確保你發佈你的實際代碼,並嘗試格式化它的清晰。 – Mat

+0

誤解是你正在鎖定一個方法,而你有一個鎖定實例的方法。 –

回答

27

​​方法在實例級別工作。該類的每個實例都有自己的鎖。每次輸入實例的任何​​方法時都會獲取鎖。這可以防止多個線程在同一個實例上調用​​方法(注意,這也可以防止不同的​​方法在相同實例上被調用)。

現在,由於您有兩個類的實例,每個實例都有自己的鎖。沒有什麼可以阻止兩個線程同時在自己的實例上運行。

如果你想避免這種情況,你可以有內部run(),其中obj將是你的類的兩個實例共享一些對象synchronized(obj)塊:

class MyThread2 implements Runnable { 
    private static final Object lock = new Object(); 
    ... 
    public void run() { 
    synchronized(lock) { 
     ... 
    } 
    } 
} 
+0

感謝您的回答 – user980089

+0

如果我們只有一個類和多個線程的實例,是否可以同時運行一些'synchronized'方法? – Sajad

+0

@ssss:當然:'靜態'與非'靜態',使用'同步'塊與不同的鎖等。如果您需要更多信息,請發佈一個新問題。 – NPE

相關問題