第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

可變變量并刷新到主內(nèi)存/從主內(nèi)存讀取

可變變量并刷新到主內(nèi)存/從主內(nèi)存讀取

尚方寶劍之說(shuō) 2021-06-25 18:01:35
官方說(shuō)明說(shuō),寫(xiě)入易失性字段與監(jiān)視器釋放具有相同的記憶效應(yīng),而從易失性字段讀取與監(jiān)視器獲取具有相同的記憶效應(yīng)。和實(shí)際上,volatile 的語(yǔ)義得到了大幅加強(qiáng),幾乎達(dá)到了同步的水平。出于可見(jiàn)性的目的,對(duì) volatile 字段的每次讀取或?qū)懭攵碱?lèi)似于“一半”同步。這是否意味著,對(duì) volatile 變量的任何寫(xiě)入都會(huì)使執(zhí)行線程將其緩存刷新到主內(nèi)存中,并且每次從 volatile 字段讀取都會(huì)使線程從主內(nèi)存中重新讀取其變量?我問(wèn)是因?yàn)橥耆嗤奈谋景寺暶髦匾f(shuō)明:請(qǐng)注意,兩個(gè)線程都必須訪問(wèn)相同的 volatile 變量,以便正確設(shè)置happens-before 關(guān)系。線程 A 在寫(xiě)入 volatile 字段 f 時(shí)可見(jiàn)的所有內(nèi)容在線程 B 讀取 volatile 字段 g 后都可見(jiàn),但情況并非如此。釋放和獲取必須“匹配”(即在同一個(gè)易失性字段上執(zhí)行)以具有正確的語(yǔ)義。而這個(gè)說(shuō)法讓我很困惑。我確信使用同步語(yǔ)句獲取和釋放常規(guī)鎖不是真的 - 如果某個(gè)線程釋放任何監(jiān)視器,那么它所做的所有更改對(duì)所有其他線程都是可見(jiàn)的(更新:實(shí)際上不是真的 - 觀看最佳答案)。在stackoverflow上甚至有一個(gè)關(guān)于它的問(wèn)題。然而,據(jù)說(shuō)無(wú)論出于何種原因,對(duì)于 volatile 字段都不是這種情況。我無(wú)法想象任何發(fā)生在保證之前的實(shí)現(xiàn),它不會(huì)使其他線程、不讀取相同 volatile 變量的線程可見(jiàn)更改。至少想象一個(gè)實(shí)現(xiàn),它與前兩個(gè)引號(hào)并不矛盾。此外,在發(fā)布這個(gè)問(wèn)題之前,我做了一些研究,例如這篇文章,其中包含這句話執(zhí)行這些指令后,所有寫(xiě)入都可以通過(guò)緩存子系統(tǒng)或主內(nèi)存對(duì)所有其他線程可見(jiàn)。提到的指令是在寫(xiě)入 volatile 字段時(shí)發(fā)生的指令。那么這個(gè)重要的筆記應(yīng)該是什么意思呢?或者我錯(cuò)過(guò)了什么?或者,也許那張紙條是完全錯(cuò)誤的?回答?經(jīng)過(guò)更多的研究,我只能在關(guān)于 volatile 字段及其對(duì)非 volatile 字段變化的影響的官方文檔中找到這樣的說(shuō)法:使用 volatile 變量可以降低內(nèi)存一致性錯(cuò)誤的風(fēng)險(xiǎn),因?yàn)閷?duì) volatile 變量的任何寫(xiě)入都會(huì)與對(duì)該相同變量的后續(xù)讀取建立先發(fā)生關(guān)系。這意味著對(duì) volatile 變量的更改始終對(duì)其他線程可見(jiàn)。更重要的是,這也意味著當(dāng)一個(gè)線程讀取一個(gè) volatile 變量時(shí),它不僅會(huì)看到對(duì) volatile 的最新更改,還會(huì)看到導(dǎo)致更改的代碼的副作用。我不知道這是否足以得出結(jié)論,只有讀取相同 volatile 的線程才能保證發(fā)生之前的關(guān)系。所以現(xiàn)在我只能總結(jié)結(jié)果是不確定的。但在實(shí)踐中,我建議考慮 thread 所做的更改A,當(dāng)它寫(xiě)入 volatile 字段時(shí),B只有當(dāng)線程B讀取相同的 volatile 字段時(shí),才保證對(duì)線程可見(jiàn)。以上來(lái)自官方來(lái)源的引用強(qiáng)烈暗示了這一點(diǎn)。
查看完整描述

2 回答

?
aluckdog

TA貢獻(xiàn)1847條經(jīng)驗(yàn) 獲得超7個(gè)贊

你從一個(gè)完全錯(cuò)誤的角度看這個(gè)。首先,您引用的是JLS而不是談?wù)?em>flush,這將是該規(guī)范的實(shí)現(xiàn)細(xì)節(jié)。您唯一需要依賴(lài)的絕對(duì)是 JLS,其他任何事情都可以知道可能是,但并不能證明任何形狀或形式的規(guī)范是對(duì)還是錯(cuò)。

你錯(cuò)的根本地方是:

我肯定知道常規(guī)鎖獲取不是真的......

在實(shí)踐中x86,您可能是對(duì)的,但JLS 官方 oracle 教程要求

當(dāng)一個(gè)線程釋放一個(gè)內(nèi)在鎖時(shí),在該操作和相同鎖的任何后續(xù)獲取之間建立了一個(gè)happens-before 關(guān)系。

Happens-before 是為后續(xù)動(dòng)作建立的(如果你愿意,請(qǐng)閱讀兩個(gè)對(duì)你來(lái)說(shuō)更簡(jiǎn)單的動(dòng)作)。一個(gè)線程釋放鎖,另一個(gè)獲取它 - 這些是后續(xù) ( release-acquire semantics)。

同樣的事情發(fā)生在一個(gè)volatile- 一些線程寫(xiě)入它,并且當(dāng)另一個(gè)線程通過(guò)后續(xù)讀取觀察到寫(xiě)入時(shí),建立了happens-before。


查看完整回答
反對(duì) 回復(fù) 2021-06-30
?
千萬(wàn)里不及你

TA貢獻(xiàn)1784條經(jīng)驗(yàn) 獲得超9個(gè)贊

這是否意味著,對(duì) volatile 變量的任何寫(xiě)入都會(huì)使執(zhí)行線程將其緩存刷新到主內(nèi)存中,并且每次從 volatile 字段讀取都會(huì)使線程從主內(nèi)存中重新讀取其變量?


不,不是那個(gè)意思。那樣想是一個(gè)常見(jiàn)的錯(cuò)誤。它的全部含義是 Java 內(nèi)存模型中指定的內(nèi)容。


在英特爾 CPU 上,有刷新緩存行的指令:clflush并且clflushopt在發(fā)生易失性寫(xiě)入時(shí)對(duì)整個(gè)緩存行進(jìn)行這種刷新是非常低效的。


為了提供一個(gè)例子,讓我們看看 volatile 變量是如何實(shí)現(xiàn)的(對(duì)于這個(gè)例子)


Java(TM) SE Runtime Environment (build 1.8.0_171-b11)

Java HotSpot(TM) 64-Bit Server VM (build 25.171-b11, mixed mode)

為了我的哈斯韋爾。讓我們寫(xiě)一個(gè)簡(jiǎn)單的例子:


public static volatile long a = 0;


public static void main(String[] args){

    Thread t1 = new Thread(() -> {

        while(true){

            //to avoid DCE

            if(String.valueOf(String.valueOf(a).hashCode()).equals(String.valueOf(System.nanoTime()))){

                System.out.print(a);

            }

        }

    });


    Thread t2 = new Thread(() -> {

        while(true){

            inc();

        }

    });


    t1.start();

    t2.start();

}


public static void inc(){

    a++;

}

我禁用了分層編譯并使用 C2 編譯器運(yùn)行它,如下所示:


java -server -XX:-TieredCompilation -XX:+UnlockDiagnosticVMOptions -XX:CompileCommand=print,*Volatile.inc -jar target/test-0.0.1.jar

輸出如下:


  # {method} {0x00007f87d87c6620} 'inc' '()V' in 'com/test/Volatlee'

  #           [sp+0x20]  (sp of caller)

  0x00007f87d1085860: sub     $0x18,%rsp

  0x00007f87d1085867: mov     %rbp,0x10(%rsp)   ;*synchronization entry

                                                ; - com.test.Volatlee::inc@-1 (line 26)


  0x00007f87d108586c: movabs  $0x7191fab68,%r10  ;   {oop(a 'java/lang/Class' = 'com/test/Volatlee')}

  0x00007f87d1085876: mov     0x68(%r10),%r11

  0x00007f87d108587a: add     $0x1,%r11

  0x00007f87d108587e: mov     %r11,0x68(%r10)

  0x00007f87d1085882: lock addl $0x0,(%rsp)     ;*putstatic a

                                                ; - com.test.Volatlee::inc@5 (line 26)


  0x00007f87d1085887: add     $0x10,%rsp

  0x00007f87d108588b: pop     %rbp

  0x00007f87d108588c: test    %eax,0xca8376e(%rip)  ;   {poll_return}

  0x00007f87d1085892: retq

  ;tons of hlt ommited

因此,在這個(gè)簡(jiǎn)單的示例中,volatile編譯為locked 指令,要求緩存行具有exclusive要執(zhí)行的狀態(tài)(如果不是,則可能向其他內(nèi)核發(fā)送讀取無(wú)效信號(hào))。


查看完整回答
反對(duì) 回復(fù) 2021-06-30
  • 2 回答
  • 0 關(guān)注
  • 232 瀏覽
慕課專(zhuān)欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)