您好,登錄后才能下訂單哦!
本篇內容主要講解“Java并發編程中volatile關鍵字有什么作用”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“Java并發編程中volatile關鍵字有什么作用”吧!
首先簡單說一下,volatile是什么?volatile是Java中的一個關鍵字,也是一種同步機制。volatile為了保證變量的可見性,通過volatile修飾的變量具有共享性。修改了volatile修飾的變量,其它線程是可以讀取到最新的值的
并發編程有三個重要特性:原子行、可見性、有序性
原子性:原子性是指一個或者多個操作,要么全部執行且執行過程不會被其它操作打斷,要么全部不執行。
可見性:可見性是指共享變量對于多個線程都是可見的,也即一個線程修改了變量,其它線程馬上就能知道
有序性:有序性是指程序的執行順序按照代碼的先后順便執行
假如我們寫一個程序,我們會期待這些語句的實際執行順便和代碼的順序是一致的,大部分情況是一致的,但實際上,編譯器、JVM 或者 CPU 都有可能出于優化等目的,對執行的順序進行調整,這個就是指令重排序
重排序的好處:提高處理速度
代碼順序如圖:
指令重排后,a=100; a= a+100會提到一起執行,效率提高
上面的例子,是可以提高執行效率,但是有時候指令重排是會導致問題的,如下代碼例子,代碼順序是先初始化content,然后設置標識為true,線程B檢測到為true之后,調用content的方法
如果指令重排后,這種情況就會出現沒初始化完成,就直接調用conten的方法
所以,指令重排有好處也有壞處,一般可能是cpu、編譯器或者是內存會進行指令重排,為了避免指令重排,保證并發編程的有序性,有時候需要使用synchronized或者volatile等等方式避免。volatile可以避免指令重排,保證并發編程的有序性,依賴于操作系統的內存屏障
從前面的學習也可以指定,volatile關鍵字是可以保證并發編程的有序性和可見性的
保證可見性
volatile保證可見性:
使用volatile變量時,必須重新從主內存加載到工作內存修改volatile變量后,必須馬上同步回主內存
可見性涉及到Java內存模型,詳細可以參考我上篇博客:鏈接
java內存模型(JMM)結構圖,每個Java線程都有自己的工作內存,volatile修飾的變量,修改后,會自動同步到主內存;每個線程讀取時都會從主內存先讀取到工作內存的副本
注意:volatile只能保證變量的可見性,對于一個Java對象是不能保證的,要去對象具體的屬性設置volatile
保證有序性
對于并發編程的有序性問題,前面已經做了比較詳細的描述,主要是cpu、jvm、內存都會對代碼執行順序進行指令重排序,加上volatile可以保證有序性,避免指令重排,依賴于操作系統的內存屏障
volatitle只能保證單個變量的原子性,不能保證一系列操作的原子操作的,所以volatile是線程不安全的,不具有原子性
volatile不可以保證線程安全,synchronized可以保證線程安全volatile是輕量的,而且是沒有鎖機制的,性能比synchronized好volatile不具有原子性,synchronized可以保證原子性
到此,相信大家對“Java并發編程中volatile關鍵字有什么作用”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。