加鎖和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同步機制做了很多優化,如:自適應的自旋鎖、鎖粗化、鎖消除、輕量級鎖等,使得它的性能明顯有了很大的提升。