- 論壇徽章:
- 0
|
上面的代碼 是不具備線程安全性的. "結果這段代碼中注釋句去掉注釋的話,會有"flag is true"的輸出,但是注釋加上的話,就永遠不會輸出"flag is true" "
你看到的這個輸出結果是不可控的, 這里一共有兩個線程 : 1 main方法, 2 t.start()
兩個線程可以同時操作 對象t的 flag屬性, 有可能main方法剛剛調用完 t.setFlag()方法 第二個線程就執(zhí)行了 flag = false , 而main方法中的第二次循環(huán)還沒有來得及第二次調用setFlag()方法 . t.start()線程的第二次循環(huán)就已經(jīng)執(zhí)行到了if(flag),而此時 flag = false. 所以不輸出 flag is true. (跟你睡眠0.5秒與否關系不大,只是不睡眠,打印flag is true的可能性會比較大)
輸出結果會受 兩個線程的執(zhí)行進度影響, 而我們幾乎無法控制這兩個線程的執(zhí)行進度,即使你對線程設定了執(zhí)行優(yōu)先級. 所以最后的輸出結果是完全不可預期的,你看到的結果只是一個現(xiàn)象,可能同樣的代碼你放到不同的機器上結果又會不同.跟你的注釋句也沒什么關系. 至于你問為什么會看到這樣的輸出結果, 只能說 不可控 什么輸出結果都有可能.
所以最好使用synchronized來控制線程同步,保證某些代碼不會被 不同線程同時執(zhí)行, 比如這里 對flag值的操作 |
|