共計 1217 個字符,預計需要花費 4 分鐘才能閱讀完成。
今天就跟大家聊聊有關如何分析 Volatile 變量,可能很多人都不太了解,為了讓大家更加了解,丸趣 TV 小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。
在程序設計中,尤其是在 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 變量有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注丸趣 TV 行業資訊頻道,感謝大家的支持。