国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【多線程】volatile關(guān)鍵字

這篇具有很好參考價(jià)值的文章主要介紹了【多線程】volatile關(guān)鍵字。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

一、volatile
  • 1.volatile的底層原理是內(nèi)存屏障,Memory Barrier, Memory Fence
  • 2.對(duì)volatile變量的寫指令(賦值操作)后會(huì)加入寫屏障
  • 3.對(duì)volatile變量的讀指令(取變量值)前會(huì)加入讀屏障
  • 4.寫屏障的作用會(huì)將寫屏障之前的賦值改動(dòng)操作,對(duì)共享變量的改動(dòng)都同步到主內(nèi)存中
  • 5.讀屏障的作用會(huì)將讀屏障之后的對(duì)共享變量的讀取,加載的是主存中最新的數(shù)據(jù)
  • 6.寫屏障的作用會(huì)確保指令重排序時(shí),不會(huì)將寫屏障之前的代碼排在寫屏障之后
  • 7.讀屏障的作用會(huì)確保指令重排序時(shí),不會(huì)將讀屏障之后的代碼排在讀屏障之前
  • 8.不能解決指令交錯(cuò),寫屏障僅僅是保證之后的讀能夠讀到最新的結(jié)果,不能保證另個(gè)線程b在線程a寫之前讀,然后在線程a寫之后,線程b再寫
  • 9.有序性的保證只保證了本線程內(nèi)相關(guān)代碼不被重新排序
  • 10.jdk1.5之后才能生效
二、保證可見性
  • 1.寫屏障(sfence)保證在該屏障之前的,對(duì)共享變量的改動(dòng),都同步到主存之中
  • 2.volatile a變量,當(dāng)a變量被賦值后,a=1后會(huì)加入一個(gè)寫屏障,會(huì)將a=1賦值操作之前的對(duì)共享變量的改動(dòng)都同步到主存中
  • 3.讀屏障(lfence)保證在該屏障之后,對(duì)共享變量的讀取,加載的是主存中最新數(shù)據(jù)
  • 4.volatile a變量,當(dāng)if(a==2)時(shí),讀取a變量前會(huì)加一個(gè)讀屏障,在讀屏障之后對(duì)共享變量的讀取加載的都是主存中最新的數(shù)據(jù)
三、保證有序性
  • 1.寫屏障會(huì)確保指令重排時(shí),不會(huì)將寫屏障之前的代碼排在寫屏障之后,例如int a = 2;boolean b = true; 假如b是被volatile關(guān)鍵字修飾,則給b賦值為true之后,會(huì)產(chǎn)生一個(gè)寫屏障,那么寫屏障之前的操作 a=2的賦值操作不會(huì)重排到寫屏障之后,也就是保證了a=2賦值操作在b=true的賦值操作之前
  • 2.讀屏障會(huì)確保指令重排時(shí),不會(huì)將讀屏障之后的代碼排在讀屏障之前,例如if(b); int a = 2; 假如b是被volatile關(guān)鍵字修飾,則讀取b變量時(shí),會(huì)給b變量讀操作前加一個(gè)讀屏障,在讀屏障之后的代碼a=2,不會(huì)重排在讀屏障之前,因此保證a=2操作在if(b)讀b變量之后
四、不能解決指令交錯(cuò)
  • 1.線程a和線程b,修改volatile關(guān)鍵字修飾的變量i
  • 2.線程a對(duì)變量i進(jìn)行自加1操作,線程b對(duì)變量i進(jìn)行自減1操作
  • 3.開始線程a讀取變量i為0,線程b讀取變量i為0
  • 4.線程a自加1成功,并將i=1寫回主存,線程b自減成功,并將i=-1寫回主存
  • 5.此時(shí)主存中變量i的值為-1,正常來(lái)說(shuō)結(jié)果應(yīng)該是0
  • 6.且在線程a、b各自的線程內(nèi),都能保證各自的指令有序,不能重排序
  • 7.因此volatile關(guān)鍵字修飾的變量沒(méi)有解決指令交錯(cuò)帶來(lái)的線程安全問(wèn)題
  • 8.線程a、線程b之間的指令會(huì)有一定的交錯(cuò),volatile不能保證原子性
  • 9.synchronized可以保證可見性、有序性和原子性(共享變量要完全在synchronized代碼塊內(nèi),如果代碼塊外部還有變量的使用,則不能保證指令不重排)

文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-462703.html

到了這里,關(guān)于【多線程】volatile關(guān)鍵字的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【JavaEE初階】多線程(三)volatile wait notify關(guān)鍵字 單例模式

    【JavaEE初階】多線程(三)volatile wait notify關(guān)鍵字 單例模式

    攝影分享~~ 以上代碼運(yùn)行的結(jié)果可能是輸入1后,t1這個(gè)線程并沒(méi)有結(jié)束。而是一直在while中循環(huán)。而t2線程已經(jīng)執(zhí)行完了。 以上情況,就叫做 內(nèi)存可見性問(wèn)題 這里使用匯編來(lái)理解,大概分為兩步操作: load,把內(nèi)存中flag的值,讀到寄存器中。 cmp,把寄存器中的值,和0進(jìn)行比

    2023年04月25日
    瀏覽(21)
  • 【iOS】—— 屬性關(guān)鍵字及weak關(guān)鍵字底層原理

    【iOS】—— 屬性關(guān)鍵字及weak關(guān)鍵字底層原理

    參考博客:IOS開發(fā)基礎(chǔ)——屬性(copy strong weak等) 內(nèi)存管理有關(guān)的: weak , assign , strong , retain , copy 線程安全有關(guān)的的: nonatomic , atomic 訪問(wèn)權(quán)限有關(guān)的的: readonly , readwrite (只讀,可讀寫) 修飾變量的: const , static , extern 這些

    2024年02月16日
    瀏覽(23)
  • volatile 關(guān)鍵字詳解

    volatile 關(guān)鍵字詳解

    目錄 volatile volatile 關(guān)鍵用在什么場(chǎng)景下: volatile 防止編譯器優(yōu)化: volatile ? 是一個(gè)在許多編程語(yǔ)言中(包括C和C++)用作的標(biāo)識(shí)符。它用于告訴編譯器不要對(duì)帶有該修飾的變量進(jìn)行優(yōu)化,以確保變量在特定情況下的可見性和預(yù)測(cè)性。 在C和C++中, volatile

    2024年02月11日
    瀏覽(25)
  • volatile關(guān)鍵字作用

    volatile關(guān)鍵字作用

    volatile是一個(gè)和多線程相關(guān)的,主要有一下2點(diǎn)作用(只保證可見性,不保證原子性) 防止指令重排(有序性) JVM在不改變程序執(zhí)行結(jié)果的前提下,在編譯時(shí)會(huì)對(duì)指令的順序進(jìn)行重新排序,而volatile則能夠禁止指令的重新排序 能夠確保線程內(nèi)存中的對(duì)象對(duì)其他內(nèi)存可

    2024年02月15日
    瀏覽(30)
  • JAVA volatile 關(guān)鍵字

    volatile 是JAVA虛擬機(jī)提供的輕量級(jí)的同步機(jī)制,有三大特性 1、保證可見性? 2、不保證原子性? 3、禁止指令重排 JMM? JAVA內(nèi)存模型本身是一種抽象的概念并不真實(shí)存在 它描述的是一組規(guī)則或規(guī)范,提供這組規(guī)范定義了程序中各個(gè)變量(包括實(shí)例變量、靜態(tài)變量)的訪問(wèn)方式。

    2024年02月13日
    瀏覽(24)
  • [JAVAee]volatile關(guān)鍵字

    [JAVAee]volatile關(guān)鍵字

    目錄 1.volatile的特性 ①保持線程可見性 2.volatile注意事項(xiàng)及適用場(chǎng)景 ①注意事項(xiàng) ②適用場(chǎng)景 volatile,譯為\\\"易變的\\\". 對(duì)此我們就可以這樣理解,對(duì)于被volatile修飾的變量的數(shù)值,是容易變化的. 在之前的線程安全文章中,我們有講解過(guò)\\\"可見性\\\",對(duì)于線程間的這個(gè)特性可能會(huì)導(dǎo)致:線程

    2024年02月16日
    瀏覽(23)
  • 【C】volatile 關(guān)鍵字

    【C】volatile 關(guān)鍵字

    1)基本概念 const 是C語(yǔ)言的一個(gè)。 const 用于告訴編譯器相應(yīng)的變量可能會(huì)在程序的控制之外被修改,因此編譯器不應(yīng)該對(duì)其進(jìn)行優(yōu)化。 聲明語(yǔ)法: 作用: 防止編譯器優(yōu)化,確保對(duì)變量的每次訪問(wèn)都是實(shí)際的讀寫操作,而不是使用緩存中的值。 用于表示可能會(huì) 被異步

    2024年01月22日
    瀏覽(42)
  • 【Java基礎(chǔ)】volatile關(guān)鍵字

    【Java基礎(chǔ)】volatile關(guān)鍵字

    關(guān)于作者:CSDN內(nèi)容合伙人、技術(shù)專家, 從零開始做過(guò)日活千萬(wàn)級(jí)APP。 專注于分享各領(lǐng)域原創(chuàng)系列文章 ,擅長(zhǎng)java后端、移動(dòng)開發(fā)、人工智能等,希望大家多多支持。 我們繼續(xù)總結(jié)學(xué)習(xí)Java基礎(chǔ)知識(shí),溫故知新。 volatile 是一個(gè)Java,可以用來(lái)修飾變量,volatile也被稱為輕

    2024年02月11日
    瀏覽(19)
  • C語(yǔ)言volatile關(guān)鍵字

    在C語(yǔ)言中, volatile 是一個(gè)類型修飾符,用于告訴編譯器對(duì)象的值可能會(huì)在編譯器無(wú)法檢測(cè)到的情況下被改變。這通常發(fā)生在以下兩種情況: 硬件的輸入/輸出操作,例如一個(gè)設(shè)備寄存器的讀取或?qū)懭搿?共享內(nèi)存的并行程序,其中一個(gè)線程修改了一個(gè)內(nèi)存位置,而另一個(gè)線程

    2024年02月07日
    瀏覽(29)
  • volatile關(guān)鍵字(輕量級(jí)鎖)

    volatile關(guān)鍵字(輕量級(jí)鎖)

    目錄 一、volatile出現(xiàn)背景 二、JMM概述 2.1、JMM的規(guī)定 ?三、volatile的特性 3.1、可見性 ?3.1.1、舉例說(shuō)明 ?3.1.2、總結(jié) 3.2、無(wú)法保證原子性 3.2.1、舉例說(shuō)明 3.2.2、分析 3.2.3、使用volatile對(duì)原子性測(cè)試 ?3.2.4、使用鎖機(jī)制 ?3.2.5、總結(jié) 3.3、禁止指令重排序 ?四、volatile的內(nèi)存語(yǔ)義 4

    2024年02月15日
    瀏覽(26)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包