作者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
1F:推 sheep922420:感谢大大...我再研读你写的回文!!! 感谢!! 08/29 18:33
2F:→ sheep922420:我对A选项的疑问是...对於共同存取的x值已经到10了 08/29 19:43
3F:→ sheep922420:再加上2,应该到12,结果反而回到6,不知道我错的点在哪? 08/29 19:47
4F:→ swpoker:提式:多执行绪的结果不是唯一!!! 08/30 09:42