轉載請註明出處:http://blog.csdn.net/ns_code/article/details/17290021
在http://blog.csdn.net/ns_code/article/details/17288243這篇博文中,講述了經過同步實現內存可見性的方法,在http://blog.csdn.net/ns_code/article/details/17101369這篇博文中,講述了經過volatile變量實現內存可見性的方法,這裏比較下兩者的區別。安全
一、volatile變量是一種稍弱的同步機制在訪問volatile變量時不會執行加鎖操做,所以也就不會使執行線程阻塞,所以volatile變量是一種比synchronized關鍵字更輕量級的同步機制。 二、從內存可見性的角度看,寫入volatile變量至關於退出同步代碼塊,而讀取volatile變量至關於進入同步代碼塊。 三、在代碼中若是過分依賴volatile變量來控制狀態的可見性,一般會比使用鎖的代碼更脆弱,也更難以理解。僅當volatile變量能簡化代碼的實現以及對同步策略的驗證時,才應該使用它。通常來講,用同步機制會更安全些。 四、加鎖機制(即同步機制)既能夠確保可見性又能夠確保原子性,而volatile變量只能確保可見性,緣由是聲明爲volatile的簡單變量若是當前值與該變量之前的值相關,那麼volatile關鍵字不起做用,也就是說以下的表達式都不是原子操做:「count++」、「count = count+1」。 當且僅當知足如下全部條件時,才應該使用volatile變量: 一、對變量的寫入操做不依賴變量的當前值,或者你能確保只有單個線程更新變量的值。 二、該變量沒有包含在具備其餘變量的不變式中。
總結:在須要同步的時候,第一選擇應該是synchronized關鍵字,這是最安全的方式,嘗試其餘任何方式都是有風險的。尤爲在、jdK1.5以後,對synchronized同步機制作了不少優化,如:自適應的自旋鎖、鎖粗化、鎖消除、輕量級鎖等,使得它的性能明顯有了很大的提高。性能