2015-10-02 54 views
-3
package NewPkg; 

class sample extends Thread{ 

    synchronized static void show() 
    { //synchronized(this){ 
     for(int i=0;i<5;i++) 
     { 
      System.out.println(i); 
     } 
    //} 
    } 

} 

class ThreadOne extends Thread { 

    public void run() 
    { 
     System.out.println("t1"); 
     sample.show(); 

    } 

} 

class ThreadTwo extends Thread { 

    public void run() 
    { 
     System.out.println("t2"); 
     sample.show(); 
    } 

} 

public class A { 
    public static void main (String args[]){ 

    ThreadOne t1 = new ThreadOne(); 
    ThreadTwo t2 = new ThreadTwo(); 

    t1.start(); 
    t2.start(); 

    } 

} 

有人請檢查此代碼並告訴我是否有任何錯誤。 嘗試刪除「同步靜態」內容並執行,檢查同步塊和方法場景。 當我執行程序,很多時候我看到相同的輸出顯示...我想知道多線程概念中的同步靜態,同步塊和方法使用之間的確切區別。我看到下面代碼中的同步靜態,同步方法和同步塊方案的輸出相同

+0

這不是建議問題的重複內容,因爲同步靜態方法和同步實例方法之間存在功能差異,並且在建議的重複內容中沒有涵蓋該差異。 –

+0

@WarrenDew例如,它在後面的答案[peter's](http://stackoverflow.com/a/574258/438154)中有介紹。 –

回答

0

靜態同步方法在類上進行同步。定期同步的方法在對象上進行同步。儘管兩個靜態同步方法不能同時運行,並且兩個常規同步方法不能同時運行,但靜態同步方法可以與常規同步方法同時運行。

在同步方法和方法之間沒有功能差異,整個方法體包裝在同步塊中同步的同一個鎖上。對於常規同步方法,等效同步塊將在this上同步。對於靜態同步方法,等同的同步塊將在類上同步。

+0

謝謝露水,爲了解釋...!您能否告訴我們哪種線程更有效率? – user2014

+0

在所有情況下,底層的鎖定機制都是相同的,所以如果以相同的方式使用它們同樣有效。同步的效率與理解您的特定用例有關,並且針對該用例使用最佳鎖定策略,而不是使用同步方法或同步塊來實現鎖定策略。 –