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

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

如果在同步鎖周圍的循環(huán)中使用變量,是否將其從“主存儲(chǔ)器中刷新”讀?。?/h1>

如果在同步鎖周圍的循環(huán)中使用變量,是否將其從“主存儲(chǔ)器中刷新”讀?。?/h1>
慕哥6287543 2021-05-14 09:05:04
請看下面的代碼:private  static boolean flag=true; // main thread will call flag=falseprivate final static Object lock=new Object(); // lock conditionpublic static void thread1(){    while (flag){        synchronized (lock){            // some work        }    }}public static void main(String[] args) throws Exception {    Thread t1=new Thread(()->{        thread1();    });    t1.start();    Thread.sleep(1000);    flag=false;    // The program can stop normally}無論何時(shí),當(dāng)一個(gè)線程進(jìn)入同步塊時(shí),是否會(huì)從主存儲(chǔ)器中加載變量標(biāo)志的值?感謝您的詳細(xì)說明,因?yàn)槲也淮_定該標(biāo)志是否具有事前關(guān)系。從字面上看,該標(biāo)志不在同步塊中。更新1:我知道使用volatile可以,而且我也知道如何編寫正確的代碼,但是我現(xiàn)在想知道是否沒有volatile關(guān)鍵字。是否同步可以保證可見性。注意:標(biāo)志變量不在同步塊中。更新2:我再次更新了代碼,我的win10 + JDK8系統(tǒng)上的代碼可以正常停止,您認(rèn)為它是正確的還是偶然的,因?yàn)樯形丛谒杏布到y(tǒng)上進(jìn)行測試,因此我需要理論指導(dǎo)。關(guān)注以下問題:循環(huán)條件(標(biāo)志變量)是否與循環(huán)內(nèi)的同步塊具有先發(fā)生關(guān)系,如果存在先發(fā)生關(guān)系,jvm是否確保從主存儲(chǔ)器中加載了標(biāo)志變量,即使標(biāo)志變量沒有在同步塊中。如果每個(gè)人都認(rèn)為沒有事前發(fā)生的關(guān)系,那么您如何解釋當(dāng)我刪除同步塊時(shí),代碼將無限期地循環(huán)。當(dāng)我添加它時(shí),它將正常停止。這只是意外嗎?
查看完整描述

2 回答

?
素胚勾勒不出你

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

可以更仔細(xì)地查看您的代碼,您所擁有的還不夠。對共享字段的訪問不在您的synchronized阻止范圍內(nèi),因此不行。


另外,Java要求以某種方式“同步”共享內(nèi)存的讀取和寫入。使用synchronizedkeyworld,通常意味著您需要在讀取和寫入上都使用它,而沒有顯示寫入。


除此之外,用于給定的一組字段或共享內(nèi)存的“鎖”對于讀取和寫入必須是相同的鎖。認(rèn)真地說,volatile這里要容易得多,并且其中的APIjava.util.concurrent甚至更容易推薦。不要嘗試重新發(fā)明輪子。


private static boolean flag = true; // must use 'resetFlag'


public void resetFlag() { synchronized( "lock" ) {flag = false;} }


public boolean getFlag() { synchronized( "lock" ) {return flag;} }


public void thread1() {

    while ( getFlag() ){

        synchronized ("lock"){

            // other work

        }

    }

}


public static void main(String[] args) throws Exception {


    Thread t1=new Thread(()->{

        thread1();

    });

    t1.start();

    Thread.sleep(1000);

    resetFlag();


    // The program can stop normally


}

我認(rèn)為以上已作了必要的更改。


關(guān)于第二次更新:the code on my win10+JDK8 system can stop normally 是的。不能保證內(nèi)存可見性,但不是禁止的??梢猿鲇谌魏卧蚴箖?nèi)存可見,即使只是“偶然地”。在Intel平臺(tái)上,Intel具有QPI總線,可繞過內(nèi)存總線高速交換內(nèi)存更新信息。但是即使可以通過軟件解決,所以最好只是將同步放在需要的地方(提示:請看AtomicBoolean。)。


查看完整回答
反對 回復(fù) 2021-05-19
?
翻閱古今

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

由于@xTrollxDudex和@markspace提供的信息,可以從jvm級別觀察循環(huán)部分中的代碼,如果不存在事前關(guān)系,則可以從以下代碼進(jìn)行優(yōu)化:


       while (flag){


        synchronized (lock){

            // some work

        }


    }

至 :


      if(flag){


        while (true){


            synchronized (lock){

                //some work

            }


        }


    }

為了確保線程可見性,我們需要避免這種優(yōu)化,例如通過volatile關(guān)鍵字或其他同步策略。循環(huán)中同步塊的外觀類似于增強(qiáng)型volatile關(guān)鍵字的功能,它保證了變量前面的可見性,因此當(dāng)我們第二次循環(huán)進(jìn)入同步塊時(shí),可以看到最新的。所做的更改,這就是循環(huán)可以正常停止的原因??雌饋聿诲e(cuò),但這不是正確的同步方法,所以不要這樣做。


查看完整回答
反對 回復(fù) 2021-05-19
  • 2 回答
  • 0 關(guān)注
  • 171 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號(hào)

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