volatile特點:
關鍵字volatile是Java虛擬機提供的最輕量級的同步機制 , 當一個變數被定義成volatile之后,具備兩種特性:
- 保證此變數對所有執行緒的可見性,當一條執行緒修改了這個變數的值,新值對于其他執行緒是可以立即得知的,而普通變數做不到這一點,
- 禁止指令重排序優化,普通變數僅僅能保證在該方法執行程序中,得到正確結果,但是不保證程式代碼的執行順序,用volatile修飾后的變數,賦值后多執行了一個lock addl指令的操作,作用相當于一個記憶體屏障,使得指令重排序時不能把后面的指令重排序到記憶體屏障之前,從而阻止了指令重排序,
基于volatile變數的運算在并發下不一定是安全的,volatile變數在各個執行緒的作業記憶體,不存在一致性問題(各個執行緒的作業記憶體中volatile變數,每次使用前都要重繪到主記憶體),但是Java里面的運算并非原子操作,導致volatile變數的運算在并發下一樣是不安全的,
volatile對比Synchronized的異同:
- Synchronized既能保證可見性,又能保證原子性,而volatile只能保證可見性,無法保證原子性,
- volatile關鍵字是執行緒同步的輕量級實作,所以volatile性能肯定比synchronized關鍵字要好,但是volatile關鍵字只能用于變數而synchronized關鍵字可以修飾方法以及代碼塊,synchronized關鍵字在JavaSE1.6之后進行了主要包括為了減少獲得鎖和釋放鎖帶來的性能消耗而引入的偏向鎖和輕量級鎖以及其它各種優化之后執行效率有了顯著提升,實際開發中使用 synchronized關鍵字的場景還是更多一些,
- 多執行緒訪問volatile關鍵字不會發生阻塞,而synchronized關鍵字可能會發生阻塞,
- volatile關鍵字主要用于解決變數在多個執行緒之間的可見性,而 synchronized關鍵字解決的是多個執行緒之間訪問資源的同步性,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/260039.html
標籤:java
上一篇:Java核心之常見時間日期
