java synchronized同步靜態方法和同步非靜態方法的區別與舉例

來源:互聯網
上載者:User

標籤: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同步靜態方法和同步非靜態方法的區別與舉例

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.