課程
/后端開發
/Java
/細說多線程之Thread VS Runnable
窗口1賣出一張票,剩余票數為:4
窗口3賣出一張票,剩余票數為:3
窗口2賣出一張票,剩余票數為:4
窗口3賣出一張票,剩余票數為:1
窗口1賣出一張票,剩余票數為:2
窗口2賣出一張票,剩余票數為:0
這是什么情況?
2016-02-21
源自:細說多線程之Thread VS Runnable 2-3
正在回答
補充一個解決辦法
這個是由于ticket--不是原子操作導致的,簡單點解釋就是當執行自減操作時在cpu內部是分了多個指令步驟執行的(假設步驟為1.先從內存讀取數據。2.將讀取的數據減一.3.返回數據)。此時你的執行結果就很明白了:程序一開始,窗口1獲取先cpu后執行到步驟1,此時又把控制權交到了窗口2,而且窗口2也剛好執行到步驟1.然后程序1繼續執行,從而數據錯誤。解決辦分兩種:1.將ticket的類型修改為AtomicInteger類型的。2.對票數做減法處理時加鎖。
舉報
認識Thread和Runnable的區別,以及使用jstack生成線程快照
1 回答打印的結果是亂的,要怎么才能使結果正確顯示呢?
1 回答怎么最后打印的是3呢
4 回答這種結果 何解?
3 回答線程執行代碼出現結果跟老師說的不一樣
4 回答執行結果跟視頻完全不一樣
Copyright ? 2025 imooc.com All Rights Reserved | 京ICP備12003892號-11 京公網安備11010802030151號
購課補貼聯系客服咨詢優惠詳情
慕課網APP您的移動學習伙伴
掃描二維碼關注慕課網微信公眾號
2016-07-20
2016-02-21
這個是由于ticket--不是原子操作導致的,簡單點解釋就是當執行自減操作時在cpu內部是分了多個指令步驟執行的(假設步驟為1.先從內存讀取數據。2.將讀取的數據減一.3.返回數據)。此時你的執行結果就很明白了:程序一開始,窗口1獲取先cpu后執行到步驟1,此時又把控制權交到了窗口2,而且窗口2也剛好執行到步驟1.然后程序1繼續執行,從而數據錯誤。解決辦分兩種:1.將ticket的類型修改為AtomicInteger類型的。2.對票數做減法處理時加鎖。