【Java並發編程】之十五:並發編程中實現記憶體可見的兩種方法比較:加鎖和volatile變數

來源:互聯網
上載者:User

標籤:多線程

   在http://blog.csdn.net/ns_code/article/details/17288243這篇博文中,講述了通過同步實現記憶體可見度的方法,在http://blog.csdn.net/ns_code/article/details/17101369這篇博文中,講述了通過volatile變數實現記憶體可見度的方法,這裡比較下二者的區別。

 

    1、volatile變數是一種稍弱的同步機制在訪問volatile變數時不會執行加鎖操作,因此也就不會使執行線程阻塞,因此volatile變數是一種比synchronized關鍵字更輕量級的同步機制。

    2、從記憶體可見度的角度看,寫入volatile變數相當於退出同步代碼塊,而讀取volatile變數相當於進入同步代碼塊。

    3、在代碼中如果過度依賴volatile變數來控制狀態的可見度,通常會比使用鎖的代碼更脆弱,也更難以理解。僅當volatile變數能簡化代碼的實現以及對同步策略的驗證時,才應該使用它。一般來說,用同步機制會更安全些。

    4、加鎖機制(即同步機制)既可以確保可見度又可以確保原子性,而volatile變數只能確保可見度,原因是聲明為volatile的簡單變數如果當前值與該變數以前的值相關,那麼volatile關鍵字不起作用,也就是說如下的運算式都不是原子操作:“count++”、“count = count+1”。

 

     若且唯若滿足以下所有條件時,才應該使用volatile變數:

     1、對變數的寫入操作不依賴變數的當前值,或者你能確保只有單個線程更新變數的值。

     2、該變數沒有包含在具有其他變數的不變式中。


總結:在需要同步的時候,第一選擇應該是synchronized關鍵字,這是最安全的方式,嘗試其他任何方式都是有風險的。尤其在、jdK1.5之後,對synchronized同步機製做了很多最佳化,如:自適應的自旋鎖、鎖粗化、鎖消除、輕量級鎖等,使得它的效能明顯有了很大的提升。

  

【Java並發編程】之十五:並發編程中實現記憶體可見的兩種方法比較:加鎖和volatile變數

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.