久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

如何分析Volatile變量

153次閱讀
沒有評論

共計 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 行業資訊頻道,感謝大家的支持。

正文完
 
丸趣
版權聲明:本站原創文章,由 丸趣 2023-08-04發表,共計1217字。
轉載說明:除特殊說明外本站除技術相關以外文章皆由網絡搜集發布,轉載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 衡水市| 威信县| 兴和县| 启东市| 雅安市| 琼海市| 塔河县| 蛟河市| 安新县| 弥勒县| 宁陵县| 石渠县| 铁岭市| 邮箱| 开封市| 鄂州市| 莱阳市| 宁蒗| 泾川县| 奈曼旗| 平潭县| 哈巴河县| 南昌县| 江西省| 定兴县| 榆林市| 伊宁县| 抚松县| 宣恩县| 沁阳市| 秀山| 建瓯市| 浮梁县| 集安市| 时尚| 全椒县| 阿合奇县| 凯里市| 定远县| 安陆市| 江门市|