【Java並發編程】:加鎖和volatile變量


 

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM