//線程1boolean stop = false;while(!stop){doSomething();}//線程2stop = true;這段代碼是很典型的一段代碼,很多人在中斷線程時可能都會采用這種標記辦法。但是事實上,這段代碼會完全運行正確么?即一定會將線程中斷么?不一定,也許在大多數時候,這個代碼能夠把線程中斷,但是也有可能會導致無法中斷線程(雖然這個可能性很小,但是只要一旦發生這種情況就會造成死循環了)。下面解釋一下這段代碼為何有可能導致無法中斷線程。在前面已經解釋過,每個線程在運行過程中都有自己的工作內存,那么線程1在運行的時候,會將stop變量的值拷貝一份放在自己的工作內存當中?! ∧敲串斁€程2更改了stop變量的值之后,但是還沒來得及寫入主存當中,線程2轉去做其他事情了,那么線程1由于不知道線程2對stop變量的更改,因此還會一直循環下去??慈缟洗a和描述,這里為什么會造成死循環,即使線程2更改了stop變量的值之后,但是還沒來得及寫入主存當中,線程2轉去做其他事情了,在我的思路里,線程2也會在做完其他事也會把stop變量的值更新。這樣不會有死循環的問題,只是時間快慢的問題。
1 回答

寶慕林4294392
TA貢獻2021條經驗 獲得超8個贊
如果沒有volatile 做修飾stop = true;,這時其他線程對stop可能不會立馬可見,但不代表永遠不可見,那只是時間問題,當然這個時間對人來講肯定很快,微妙級別的或更短
你只要線程2給stop賦了true,不管你再去做啥事線程1都會停止
添加回答
舉報
0/150
提交
取消