麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 學院 > 開發設計 > 正文

關于一個可見性和指令重排序的例子

2019-11-10 20:22:38
字體:
來源:轉載
供稿:網友

java cocurrency in PRactice

public class NoVisibility { private static boolean ready; private static int number; private static class ReaderThread extends Thread{ public void run(){ while (!ready) { System.out.println(3); // Thread.yield(); } System.out.println(number); } } public static void main(String args[]) throws Exception{ new ReaderThread().start(); //Thread.sleep(1000);//2 number=42;//1 ready=true;//1 }}

書中說可能會持續循環下去(看不到ready的新值,可見性), 也有可能輸出0(指令重排序)。

可見性的問題是由于ReaderThread線程可能會在工作內存中緩存ready的值,在主線程更新完ready的值后,ReaderThread線程的工作內存沒有得到刷新。

指令重排序的問題時由于注釋1處兩行代碼由于編譯器、處理器或Runtime的優化,可能會發生顛倒,導致ReaderThread線程讀到了ready新值,此時卻沒有讀到number的新值。

但是在實際運行時,發現根本不會發生死循環,也不會輸出0。原因可能是在現代多核處理器計算機上,代碼中主線程啟動完一個子線程后,主線程幾乎不會掛起而是繼續執行,而新子線程的啟動又是需要一段時間的,所以代碼1中的指令總是先于新子線程的代碼。

因此,我在注釋2處讓主線程掛起1秒,確保子線程已經啟動完成,即保證注釋1代碼晚于子線程代碼執行。按理說此時ready變量不是volatile類型,主線程更新完ready的值后子線程應該看不到才對,因此一直輸出3,但是在實際執行代碼時,運行結果卻是程序正常退出,并且輸出number的新值42。按照網上說法,可能是jdk自身優化了代碼,導致子線程可以看到主線程更新的ready新值。

雖然說實際運行代碼時沒有出現可見性或指令重排序的問題,但這并不表明代碼是正確的,程序仍然后風險存在,要確保程序表現出正確性,成為線程安全的,還是需要使用volatile變量。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 美女黄网站免费观看 | 美女很黄很黄免费的 | 色综合精品| 一区二区三区在线播放视频 | 性生活香蕉视频 | 久久99精品久久久久久园产越南 | 亚洲小视频在线播放 | 韩国一级免费视频 | 久久国产乱子伦精品 | 毛片免费视频播放 | 午夜视频在线看 | 久久国产精品99国产 | 久草热久 | 经典三级在线视频 | 精品亚洲va在线va天堂资源站 | 99re66热这里只有精品8 | 国产一区二区三区四区五区在线 | 毛片在线免费 | 欧美成人免费一区二区三区 | av国产免费| 久久久精品视 | 国产精品成人av片免费看最爱 | 一区二区三区在线视频观看58 | fc2国产成人免费视频 | 成人午夜免费在线观看 | 黄色二区三区 | 欧美性受xxxxxx黑人xyx性爽 | 久久国产精品久久久久 | 精品无吗乱吗av国产爱色 | 99精品国产小情侣高潮露脸在线 | 久久区二区 | 亚洲欧美日韩免费 | 精品一区二区三区免费毛片 | 蜜桃av网 | 13一14毛片免费看 | a级在线| 成人毛片视频免费 | 羞羞视频免费观看入口 | 日本在线不卡免费 | 99爱视频| a免费视频 |