標籤:多線程
在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變數