2015-10-02 57 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

在所有情况下,底层的锁定机制都是相同的,所以如果以相同的方式使用它们同样有效。同步的效率与理解您的特定用例有关,并且针对该用例使用最佳锁定策略,而不是使用同步方法或同步块来实现锁定策略。 –