大家好,又見面了,我是你們的朋友全棧君。
線程安全考慮三個方面:原子性,可見性,有序性
為什麼使用voliate關鍵字?
正常情況下編譯器為了加快程式運作的速度,對一些變量的寫操作會先在寄存器或者是CPU緩存上進行,最後才寫入記憶體.而在這個過程,變量的新值對其他線程是不可見的.而volatile的作用就是使它修飾的變量的讀寫操作都必須在記憶體中進行!
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiAjM2EzLcd3LcJzLcJzdllmVldWYtl2Pn5GcuMTMyMzYxQ2MxATMwIWOmVTOxUjM2IWY4MWN0U2NhdTNvw1NzUzMyIDOtUGall3LcVmdhNXLwRHdo9CXt92YucWbpRWdvx2Yx5yazF2Lc9CX6MHc0RHaiojIsJye.png)
- voliate和synchronized差別
- volatile本質是在告訴jvm目前變量在寄存器中的值是不确定的,需要從主存中讀取,synchronized則是鎖定目前變量,隻有目前線程可以通路該變量,其他線程被阻塞住.
- volatile僅能使用在變量級别,synchronized則可以使用在變量,方法.
- volatile僅能實作變量的修改可見性,但不具備原子特性,而synchronized則可以保證變量的修改可見性和原子性.
- volatile不會造成線程的阻塞,而synchronized可能會造成線程的阻塞.
- volatile标記的變量不會被編譯器優化,而synchronized标記的變量可以被編譯器優化.
釋出者:全棧程式員棧長,轉載請注明出處:https://javaforall.cn/136335.html原文連結:https://javaforall.cn