最佳答案
从 OCP Java SE 6程序员实践考试第291页,问题25:
public class Stone implements Runnable {
static int id = 1;
public void run() {
id = 1 - id;
if (id == 0)
pick();
else
release();
}
private static synchronized void pick() {
System.out.print("P ");
System.out.print("Q ");
}
private synchronized void release() {
System.out.print("R ");
System.out.print("S ");
}
public static void main(String[] args) {
Stone st = new Stone();
new Thread(st).start();
new Thread(st).start();
}
}
答案之一是:
输出可以是
P Q P Q
我把这个答案标记为正确,我的理由是:
run()
。1 - id
进行评估。结果是 0
。它存储在线程的堆栈上。我们正要把 0
保存到静态 id
,但是..。run()
。静态 id
仍然是 1
,所以他执行方法 pick()
。 P Q
被打印。0
并保存到静态 id
。因此,第一个线程也执行 pick()
并打印 P Q
。然而,书中写道,这个答案是不正确的:
这是不正确的,因为行
id = 1 - id
在0
和1
之间交换id
的值。同一个方法不可能执行两次。
我不同意。我认为上面提到的情况还是有可能发生的。这种互换不是原子的。我说错了吗?