中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何分析Volatile變量

發布時間:2022-01-14 16:51:06 來源:億速云 閱讀:100 作者:柒染 欄目:云計算

今天就跟大家聊聊有關如何分析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變量有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

普宁市| 新营市| 北海市| 新巴尔虎右旗| 佛学| 肃宁县| 多伦县| 陇川县| 阿合奇县| 新巴尔虎右旗| 乌鲁木齐市| 龙里县| 淮南市| 苏尼特左旗| 沙湾县| 宁都县| 茌平县| 古蔺县| 浪卡子县| 海口市| 葵青区| 寻乌县| 会同县| 酉阳| 宁蒗| 日喀则市| 册亨县| 西峡县| 桦川县| 英吉沙县| 子长县| 淮北市| 延边| 习水县| 南陵县| 定襄县| 绵竹市| 龙江县| 汉阴县| 河间市| 中山市|