?? ??? ??????
?????Thread.sleep(1)
換成Thread.sleep(1000)
就能獲取flag
修改后的值,即td.isFlag()
返回true
.
Java ??? ??? ??? ???? ? ??? ??? ???? ?? ??????. ?? ??? ? ????
?? ??: Java ?????? ?? ???? ??????
??? ??? ??? ?? ????? ????. "?? ???? ?? ?? ?? ??? ??? ?????"? ???? ?? ????? ?? ??? ???? ????.
sleep(1000)
??? ?? ??? ?? ?? ?? ??? ????. JVM? ?? ???? ?? ? ??? ? ?? ????? ??? ?? ???? ?? ? ? ??? ???? ???? ??? ???? ????.
????? ???
???? ??? ????? ???. ??? "Thread.sleep(1)
? Thread.sleep(1000)
?? ??? ??? ??? ?? ? ????"? ??? ??? ????.
?? ?????? ? ?? ???? ????. ?? ???(?? ??? M??? ?)? new Thread(td)
(?? ??? T?? ?)???. volatile
關(guān)鍵字的功能。但是 “把 Thread.sleep(1)
換成 Thread.sleep(1000)
就能獲得預(yù)期效果” 這樣做理解上是不對(duì)的。
首先,程序中總共有兩個(gè)線程,主線程(暫稱 線程M)和 new Thread(td)
(暫稱 線程T)。
當(dāng)寫(xiě) Thread.sleep(1)
的時(shí)候,線程M 在 1ms 之后,便開(kāi)始在 while(true)
循環(huán)中檢查 td.isFlag()
的值,但是因?yàn)閮?nèi)存可見(jiàn)性的關(guān)系,線程M 并不能及時(shí)讀取 線程T 中 flag 的值,所以此時(shí)導(dǎo)致了死循環(huán);
當(dāng)寫(xiě) Thread.sleep(1000)
的時(shí)候,M 在 1000ms 之后,開(kāi)始在 while(true)
循環(huán)中檢查 td.isFlag()
的值;但是 T 在 200ms 的時(shí)候,便將 flag 的值設(shè)為 true
了,所以,M 在 1000ms 之后檢測(cè) td.isFlag()
的值肯定是返回 true
的,那么第一次判斷便會(huì)返回 true
,產(chǎn)生輸出并跳出 while(true)
循環(huán)。
為了讓 線程M 及時(shí)讀取到 線程T 中 flag 的值,需要將 flag 使用 volatile
關(guān)鍵字進(jìn)行修飾:
private volatile boolean flag = false;
那么每次對(duì) flag 的修改,其他線程都立馬可見(jiàn)。關(guān)于 volatile
Thread.sleep(1)
? ??? ? ??? M? 1ms ? while(true)
???? td.isFlag() ??? ?????. ??? ??? ????? ?? ??? M? ??? T? ??? ?? ??? ?? ? ???? ?? ?? ??? ?????. ??
??Thread.sleep(1000)
? ??? ? M? 1000ms ?? while(true)
???? td.isFlag()
? ???? ?????. code>; ??? T? 200ms?? flag ?? true
? ????? M? td.isFlag( 1000ms ?? )
? ???? true
?? ? ?? ??? true
? ???? ??? ???? while(true)
code> ???? ??????. ??
????? M? ??? T? flag ?? ??? ???? flag? ???
???? ???? ???. ??
????
????? ???? ?? ?? ?? ??? ?? ?? ???? ?????. ???
??? ???? ? ???? Java Multithreading (6): Use of the ??? ??? ??? ?????.
?? 3?? ??? ????? ???.
???? ?????? ??? ??? ?? ????? ??? ? ?? ?????.
? ??? ? ??? ???? ?? synchronized
? ???? ????. synchronized
解決此問(wèn)題,大多數(shù)工作場(chǎng)景用這個(gè)好
第三個(gè)是使用volatile
? ??? ? ??? ???? ?? ???
? ???? ????. ?? ??????? ??? ????? ?? ??? ???? ?????