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

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

《Java并發(fā)編程實(shí)戰(zhàn)》一段代碼的疑惑

《Java并發(fā)編程實(shí)戰(zhàn)》一段代碼的疑惑

慕虎7371278 2019-05-23 16:24:37
《Java并發(fā)編程實(shí)戰(zhàn)》3.1節(jié)的一段代碼:publicclassNoVisibility{privatestaticbooleanready;privatestaticintnumber;privatestaticclassReaderThreadextendsThread{publicvoidrun(){while(!ready)Thread.yield();System.out.println(number);}}publicstaticvoidmain(String[]args){newReaderThread().start();number=42;ready=true;}}按照書中所講,這段代碼不一定輸出42,有可能陷入死循環(huán)。原因是代碼中沒(méi)有足夠的同步機(jī)制,無(wú)法保證主線程寫入的ready他number對(duì)讀線程是可見(jiàn)的。也有可能是0,原因是“重排序”,讀線程看到了主線程寫入的ready卻沒(méi)有看到number。但是經(jīng)過(guò)多次測(cè)試,始終輸出42,既沒(méi)有輸出0,也沒(méi)有死循環(huán)。為了驗(yàn)證書中所說(shuō)的主線程修改對(duì)讀線程不可見(jiàn),我改寫了代碼:publicclassNoVisibilityLoop{privatestaticintnumber;privatestaticclassReaderThreadextendsThread{publicvoidrun(){while(true){System.out.println(number);try{Thread.sleep(200);}catch(InterruptedExceptione){}}}}publicstaticvoidmain(String[]args)throwsInterruptedException{newReaderThread().start();Thread.sleep(1000);number=42;}}多次測(cè)試輸出結(jié)果是:0000042424242這個(gè)結(jié)果說(shuō)明了主線程寫入的number對(duì)讀線程是可見(jiàn)的。但是這本書的作者一堆大牛,不會(huì)搞錯(cuò)的。還請(qǐng)大家?guī)兔纯次业尿?yàn)證方法哪里出問(wèn)題了,謝謝。運(yùn)行環(huán)境:jdk1.8.0_101,server模式。
查看完整描述

2 回答

?
HUX布斯

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

首先測(cè)試多次正確也不能保證完全就是正確的,其次這本書是jdk5和6了,jdk8估計(jì)做了些優(yōu)化,
privatestaticbooleanready;
privatestaticintnumber;
privatestaticclassReaderThreadextendsThread{
@Override
publicvoidrun(){
inti=0;
while(!ready){
i++;
//Thread.yield();
}
System.out.println(number);
}
}
publicstaticvoidmain(String[]args)throwsException{
newReaderThread().start();
TimeUnit.MILLISECONDS.sleep(9);
number=42;
ready=true;
}
把thread.yield換成i++或者sleep與否結(jié)果都有差別這種執(zhí)行順序是指令重排決定的,不用volatile沒(méi)法保證
                            
查看完整回答
1 反對(duì) 回復(fù) 2019-05-23
?
楊__羊羊

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

原文的意思是讓你重復(fù)多次運(yùn)行這段代碼大概運(yùn)行幾十次甚至上百次,可能出現(xiàn)一次死循環(huán),而這個(gè)在實(shí)際開(kāi)發(fā)中是不可取的
而這是代碼設(shè)計(jì)缺陷的問(wèn)題,所以建議不要這么編程,要保持主副線程的同步性不要用這樣的寫法,你繼續(xù)往后看,這書既然這么說(shuō),可能會(huì)有別的解決方案來(lái)幫你理解他描述的原理
                            
查看完整回答
反對(duì) 回復(fù) 2019-05-23
  • 2 回答
  • 0 關(guān)注
  • 523 瀏覽
慕課專欄
更多

添加回答

舉報(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)