最佳答案
从 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的值。同一个方法不可能执行两次。
我不同意。我认为上面提到的情况还是有可能发生的。这种互换不是原子的。我说错了吗?