您好,登錄后才能下訂單哦!
今天就跟大家聊聊有關如何分析Volatile變量,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。
在程序設計中,尤其是在C語言、C++、C#和Java語言中,使用volatile關鍵字聲明的變量或對象通常擁有和優化和(或)多線程相關的特殊屬性。通常,volatile關鍵字用來阻止(偽)編譯器對那些它認為變量的值不能“被代碼本身”改變的代碼上執行任何優化。 在C環境中,volatile關鍵字的真實定義和適用范圍經常被誤解,加之C++、C#和Java都從C中神秘地“繼承”了volatile,在這些編程語言中,因此這些語言中volatile的用法和語義大相徑庭。
Java也支持volatile關鍵字,但它被用于其他不同的用途。當volatile用于一個作用域時,Java保證如下:
1.(適用于Java所有版本)讀和寫一個volatile變量有全局的排序。也就是說每個線程訪問一個volatile作用域時會在繼續執行之前讀取它的當前值,而不是(可能)使用一個緩存的值,直接從主存中讀取,避免編譯器優化。(但是并不保證經常讀寫volatile作用域時讀和寫的相對順序,也就是說通常這并不是有用的線程構建)。
2.(適用于Java5及其之后的版本)volatile的讀和寫建立了一個happens-before關系,類似于申請和釋放一個互斥鎖。
這時,聯想到的另一個關鍵詞便是synchronized.可用來給對象和方法或者代碼塊加鎖,當它鎖定一個方法或者一個代碼塊的時候,同一時刻最多只有一個線程執行這個段代碼。當兩個并發線程訪問同一個對象object中的這個加鎖同步代碼塊時,一個時間內只能有一個線程得到執行。另一個線程必須等待當前線程執行完這個代碼塊以后才能執行該代碼塊。然而,當一個線程訪問object的一個加鎖代碼塊時,另一個線程仍然可以訪問該object中的非加鎖代碼塊。
因此,兩個關鍵詞的區別如下:
1.volatile本質是在告訴jvm當前變量在寄存器(工作內存)中的值是不確定的,需要從主存中讀取;synchronized則是鎖定當前變量,只有當前線程可以訪問該變量,其他線程被阻塞住。
2.volatile僅能使用在變量級別;synchronized則可以使用在變量、方法、和類級別的。
3.volatile僅能實現變量的修改可見性,并能保證原子性;而synchronized則可以保證變量的修改可見性和原子性。
4.volatile不會造成線程的阻塞;synchronized可能會造成線程的阻塞。
5.volatile標記的變量不會被編譯器優化;synchronized標記的變量可以被編譯器優化。
看完上述內容,你們對如何分析Volatile變量有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。