《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模式。
《Java并發(fā)編程實(shí)戰(zhàn)》一段代碼的疑惑
慕虎7371278
2019-05-23 16:24:37