作者swpoker (swpoker)
看板java
標題Re: [問題] SCJP 多執行緒問題
時間Thu Aug 29 16:49:04 2013
※ 引述《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