看板 java 關於我們 聯絡資訊
※ 引述《sheep922420 ()》之銘言: : 第233題 : Given: : 1. public class Threads1{ : 2. int x = 0; : 3. public class Runner implements Runnable{ : 4. public void run(){ : 5. int current = 0; : 6. for(int i=0; i<4; i++){ : 7. current = x; : 8. System.out.print(current + ", "); : 9. x = current + 2; : 10. } : 11. } : 12. } : 13. : 14. public static void main(String[] args){ : 15. new Threads1().go(); : 16. } : 17. : 18. public void go(){ : 19. Runnable rl = new Runner(); : 20. new Thread(r1).start(); : 21. new Thread(r1).start(); : 22. } : 23.} : Which two are possible results? (Choose two.) : A. 0, 2, 4, 4, 6, 8, 10, 6, 執行緒互相搶 : B. 0, 2, 4, 6, 8, 10, 2, 4, 執行緒也是互相搶 但是不會出現最後是2,4的狀況 A跟B的差別在於 a:current = x b:pring current c:x = current + 2 x的初始是0 有兩個thread的步驟如下(重覆abc) thread1:a0 b0 c0 a1 b1 c1 a2 b2 c2 a3 b3 c3 thread2:a0 b0 c0 a1 b1 c1 a2 b2 c2 a3 b3 c3 (執行緒就是上述的亂亂排) 最後的結果是2,4代表b不是某個執行緒的b2就是是b3 有可能是 t1.b3 t2.b3 (t1 t2順序沒差) t.b2 t.b3 (有b2的話 代表一定是相同的thread) 所以不管怎麼樣前面都會跑過c0 到c1 x一定會被加總2次 所以最後不可能會有2出現 前面執行緒在怎麼混亂 到最後第二筆列印至少4起跳 : C. 0, 2, 4, 6, 8, 10, 12, 14, 沒有執行緒的問題~神奇! : D. 0, 0, 2, 2, 4, 4, 6, 6, 8, 8, 10, 10, 12, 12, 14, 14, 不可能 : E. 0, 2, 4, 6, 8, 10, 12, 14, 0, 2, 4, 6, 8, 10, 12, 14, 不可能 : 答案:AC : 我的問題是在A, : 我的認知是, main 方法中呼叫 go 方法 : 而 go方法依序 呼叫了 new Thread(r1).start(); : new Thread(r1).start(); : 程式執行的順序是 第一條執行緒 跑了回圈三次 並對 x 及 current 變數做修改 : 再由第二條執行緒取得執行, 跑了迴圈四次 : 可是 A 最後一個輸出卻是 6 : 用eclipse 測試這個 code 也確實輸出會有遞增後又減少的情形 : 我想應該是我誤解程式執行的流程 : 想請問版上高手我錯誤的點在哪??? : 謝謝!!! -- -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 163.29.29.131
sheep922420:感謝大大...我再研讀你寫的回文!!! 感謝!! 08/29 18:33
sheep922420:我對A選項的疑問是...對於共同存取的x值已經到10了 08/29 19:43
sheep922420:再加上2,應該到12,結果反而回到6,不知道我錯的點在哪? 08/29 19:47
swpoker:提式:多執行緒的結果不是唯一!!! 08/30 09:42