標籤:java 線程 synchronized 同步非靜態方法 同步靜態方法
synchronized關鍵字是java並發編程中為瞭解決線程對共用資源的競爭造成錯誤,而提供的解決方案。synchronized關鍵字有兩種用法,一種是只用於方法的定義中,另外一種是synchronized塊,我們不僅可以使用synchronized來同步一個物件變數,你也可以通synchronized來同步類中的靜態方法和非靜態方法。那麼問題來了,同步靜態方法與動態方法有什麼區別呢?看完下面這個例子或許你就明白了。
public class test2 { public static int count = 0; public static synchronized void inc() { count++; }
public synchronized void inc2() { count++; }
public static void main(String[] args) { //同時啟動1000個線程,去進行i++計算,看看實際結果 for (int i = 0; i < 10000; i++) { new Thread(new Runnable() { @Override public void run() { test2 t=new test2(); <span style="white-space:pre"></span>test2.inc(); //同步靜態方法
<span style="white-space:pre"></span>t.inc2();//同步動態方法
<span style="white-space:pre"></span>}
<span style="white-space:pre"></span>}
<span style="white-space:pre"></span>Thread.sleep(1000);
<span style="white-space:pre"></span>System.out.println("結果: "+count);
}
}
在上面例子中,分別運行test2.inc()與t.inc2(),發現,當同步靜態方法時,結果始終為10000,而當運行同步動態方法時,結果則可能不為10000.
究其原因,調用synchronized非static方法加到當前對象上,static方法加到類的Class對象上。由於在Main中的迴圈每一次動建立一個test2對象,所以運行非靜態方法inc2時,加鎖的對象只是當前線程中的對象,實際上並沒有實現對其它線程中test2對象的限制,因此可能出現多個對象同時寫count,而static方法是對class對象加鎖,對該對象中的包括static變數的訪問都會受到同步的控制。
java synchronized同步靜態方法和同步非靜態方法的區別與舉例