溫馨提示×

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

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何分析Volatile變量

發(fā)布時(shí)間:2022-01-14 16:51:06 來源:億速云 閱讀:94 作者:柒染 欄目:云計(jì)算

今天就跟大家聊聊有關(guān)如何分析Volatile變量,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。

    在程序設(shè)計(jì)中,尤其是在C語言、C++、C#和Java語言中,使用volatile關(guān)鍵字聲明的變量或?qū)ο笸ǔ碛泻蛢?yōu)化和(或)多線程相關(guān)的特殊屬性。通常,volatile關(guān)鍵字用來阻止(偽)編譯器對(duì)那些它認(rèn)為變量的值不能“被代碼本身”改變的代碼上執(zhí)行任何優(yōu)化。 在C環(huán)境中,volatile關(guān)鍵字的真實(shí)定義和適用范圍經(jīng)常被誤解,加之C++、C#和Java都從C中神秘地“繼承”了volatile,在這些編程語言中,因此這些語言中volatile的用法和語義大相徑庭。

    Java也支持volatile關(guān)鍵字,但它被用于其他不同的用途。當(dāng)volatile用于一個(gè)作用域時(shí),Java保證如下:

   1.(適用于Java所有版本)讀和寫一個(gè)volatile變量有全局的排序。也就是說每個(gè)線程訪問一個(gè)volatile作用域時(shí)會(huì)在繼續(xù)執(zhí)行之前讀取它的當(dāng)前值,而不是(可能)使用一個(gè)緩存的值,直接從主存中讀取,避免編譯器優(yōu)化。(但是并不保證經(jīng)常讀寫volatile作用域時(shí)讀和寫的相對(duì)順序,也就是說通常這并不是有用的線程構(gòu)建)。

   2.(適用于Java5及其之后的版本)volatile的讀和寫建立了一個(gè)happens-before關(guān)系,類似于申請(qǐng)和釋放一個(gè)互斥鎖。

     這時(shí),聯(lián)想到的另一個(gè)關(guān)鍵詞便是synchronized.可用來給對(duì)象和方法或者代碼塊加鎖,當(dāng)它鎖定一個(gè)方法或者一個(gè)代碼塊的時(shí)候,同一時(shí)刻最多只有一個(gè)線程執(zhí)行這個(gè)段代碼。當(dāng)兩個(gè)并發(fā)線程訪問同一個(gè)對(duì)象object中的這個(gè)加鎖同步代碼塊時(shí),一個(gè)時(shí)間內(nèi)只能有一個(gè)線程得到執(zhí)行。另一個(gè)線程必須等待當(dāng)前線程執(zhí)行完這個(gè)代碼塊以后才能執(zhí)行該代碼塊。然而,當(dāng)一個(gè)線程訪問object的一個(gè)加鎖代碼塊時(shí),另一個(gè)線程仍然可以訪問該object中的非加鎖代碼塊。

   因此,兩個(gè)關(guān)鍵詞的區(qū)別如下:

1.volatile本質(zhì)是在告訴jvm當(dāng)前變量在寄存器(工作內(nèi)存)中的值是不確定的,需要從主存中讀??;synchronized則是鎖定當(dāng)前變量,只有當(dāng)前線程可以訪問該變量,其他線程被阻塞住。

2.volatile僅能使用在變量級(jí)別;synchronized則可以使用在變量、方法、和類級(jí)別的。

3.volatile僅能實(shí)現(xiàn)變量的修改可見性,并能保證原子性;而synchronized則可以保證變量的修改可見性和原子性。

4.volatile不會(huì)造成線程的阻塞;synchronized可能會(huì)造成線程的阻塞。 

5.volatile標(biāo)記的變量不會(huì)被編譯器優(yōu)化;synchronized標(biāo)記的變量可以被編譯器優(yōu)化。

看完上述內(nèi)容,你們對(duì)如何分析Volatile變量有進(jìn)一步的了解嗎?如果還想了解更多知識(shí)或者相關(guān)內(nèi)容,請(qǐng)關(guān)注億速云行業(yè)資訊頻道,感謝大家的支持。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI