2016-05-04 48 views
0

這裏是我的代碼爲什麼「秀」字也被第二線程印刷雖然我們已經應用了synchronized關鍵字這意味着我們已經鎖定了目標

class Thread1 extends Thread 
{ 
public synchronized void show() 
{ 
    System.out.println("show"); 
    System.out.println(Thread.currentThread().getName()); 
    try 
    { 
    Thread.sleep(5000); 
    } 
    catch(Exception e) 
    { 
    System.out.println(e); 
    } 
} 

public synchronized void display() 
{ 
    System.out.println("Display"); 
    System.out.println(Thread.currentThread().getName()); 
} 

public static void main(String args[]) 
{ 
    Thread1 z=new Thread1(); 
    z.set(); 
} 

public void set() 
{ 
    Thread1 tr=new Thread1(); 
    Thread1 tr1=new Thread1(); 
    tr.start(); 
    tr1.start(); 
} 

public void run() 
{ 
    try 
    { 
    show(); 
    display(); 
    } 

    catch(Exception e) 
    { 
    System.out.println(e); 
    } 
} 
} 

回答

0

我假設你的意思是問爲什麼show是在兩個線程名稱之一打印前由兩個線程打印。

您正在同步您的實例方法,因此它們隱式地鎖定了調用該方法的對象。但是,您有兩個不同的對象鎖定在自己身上,因此這兩個線程都不會阻止另一個進入同步方法。

如果您打算只有一個Thread執行每個​​方法,那麼您需要鎖定一個通用對象。使用​​塊鎖定Thread1.class

下面是show方法的外觀。

public void show() 
{ 
    synchronized (Thread1.class) 
    { 
     System.out.println("show"); 
     System.out.println(Thread.currentThread().getName()); 
     try 
     { 
      Thread.sleep(5000); 
     } 
     catch (Exception e) 
     { 
      System.out.println(e); 
     } 
    } 
} 

display方法可以進行類似的修改。

0

您正在實例化具有自己狀態(tr和tr1)的兩個不同對象。他們從不訪問同一個同步塊,因此從不阻止等待另一個完成。

嘗試將show方法移動到另一個類,例如,實例化該類,然後將其傳遞給tr和tr1作爲構造函數參數。

相關問題