課程
/后端開發
/Java
/細說Java多線程之內存可見性
這里加了sleep后,結果多次不是500,sleep在這里起到什么作用呢
2015-12-02
源自:細說Java多線程之內存可見性 4-2
正在回答
線程是搶占式執行的,sleep意味著當前線程在一段時間內不執行操作,可是該線程的工作內存中已經得到了number,沒有改變number的值意味著主內存中的值也沒有改變,在sleep這段時間內其他線程又得到主內存中的number,這個number與sleep中的number可能一樣(要是沒有其它線程),這樣的話這2個線程在最終執行完之后等于number++只執行一次
休眠時間內可能有其他線程讀取了number的值,但是number還沒有被修改,所以number值變小了
關于為什么不是500的次數變多了,一下是依據我對sleep()的理解產生的想法:
先說一下sleep():sleep()方法(休眠)是線程類(Thread)的靜態方法,調用此方法會讓當前線程暫停執行指定的時間,將執行機會(CPU)讓給其他線程,但是對象的鎖依然保持,因此休眠時間結束后會自動恢復。注意這里的恢復并不是恢復到執行的狀態,而是恢復到等待池中等待CPU的寵幸。
下面開始解釋為什么反而變多了:當你沒有休眠0.1S的時候,線程們依次執行,就算有競爭也不會很激烈(因為部分線程執行完了就死掉了)。但是!答主讓每個線程都休眠0.1S之后,這個時間讓 ?更多的線程(我不敢保證是所有線程)累積到等待池中了,0.1S之后就是百家爭鳴,競爭者的數量達到空前的高。沖突也就高,所以很容易讓結果出錯。
你根本的問題在于沒有理解線程獲得時間片的機制,也沒有理解線程爭用的概念。所以你提了一連串的問題。建議你把這門課前面的深入淺出Java多線程再看幾遍。光講速度不講質量有什么用?
?? 該方法是睡眠的意思,就是說? 調用該方法的線程睡眠指定時間值的功能,指定時間值就是那個100的參數,也就是0.1秒,就是自動放棄CPU的執行權,等0.1秒后,才有獲取CPU執行權的資格。
慕斯卡4106679 提問者
舉報
用兩種方式實現內存可見性,代領大家深層次學習Java中的內存
1 回答關于sleep會讓效果更明顯的想法
2 回答final的作用
1 回答為什么了加入sleep后,結果會變得明顯?
2 回答thread.sleep()可以在代碼段中的任何時候執行嗎 這也是指令重拍序嗎 代碼中sleep是在number++之上的 然后講解中有這種情況
4 回答B線程工作空間何值的問題
Copyright ? 2025 imooc.com All Rights Reserved | 京ICP備12003892號-11 京公網安備11010802030151號
購課補貼聯系客服咨詢優惠詳情
慕課網APP您的移動學習伙伴
掃描二維碼關注慕課網微信公眾號
2017-02-21
線程是搶占式執行的,sleep意味著當前線程在一段時間內不執行操作,可是該線程的工作內存中已經得到了number,沒有改變number的值意味著主內存中的值也沒有改變,在sleep這段時間內其他線程又得到主內存中的number,這個number與sleep中的number可能一樣(要是沒有其它線程),這樣的話這2個線程在最終執行完之后等于number++只執行一次
2016-11-16
休眠時間內可能有其他線程讀取了number的值,但是number還沒有被修改,所以number值變小了
2016-07-21
關于為什么不是500的次數變多了,一下是依據我對sleep()的理解產生的想法:
先說一下sleep():sleep()方法(休眠)是線程類(Thread)的靜態方法,調用此方法會讓當前線程暫停執行指定的時間,將執行機會(CPU)讓給其他線程,但是對象的鎖依然保持,因此休眠時間結束后會自動恢復。注意這里的恢復并不是恢復到執行的狀態,而是恢復到等待池中等待CPU的寵幸。
下面開始解釋為什么反而變多了:當你沒有休眠0.1S的時候,線程們依次執行,就算有競爭也不會很激烈(因為部分線程執行完了就死掉了)。但是!答主讓每個線程都休眠0.1S之后,這個時間讓 ?更多的線程(我不敢保證是所有線程)累積到等待池中了,0.1S之后就是百家爭鳴,競爭者的數量達到空前的高。沖突也就高,所以很容易讓結果出錯。
2015-12-02
你根本的問題在于沒有理解線程獲得時間片的機制,也沒有理解線程爭用的概念。所以你提了一連串的問題。建議你把這門課前面的深入淺出Java多線程再看幾遍。光講速度不講質量有什么用?
2015-12-02
?? 該方法是睡眠的意思,就是說? 調用該方法的線程睡眠指定時間值的功能,指定時間值就是那個100的參數,也就是0.1秒,就是自動放棄CPU的執行權,等0.1秒后,才有獲取CPU執行權的資格。