Ada*_*zyk 74 java multithreading swap scjp atomic
从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();
}
}
Run Code Online (Sandbox Code Playgroud)
其中一个答案是:
输出可能是
P Q P Q
我把这个答案标记为正确.我的推理:
run().1 - id.结果是0.它存储在线程的堆栈中.我们正准备将其保存0为静态id,但......run().静态id仍然是1,所以他执行方法pick().P Q打印出来.0从堆栈中获取并保存为静态id.所以,第一个线程也执行pick()并打印P Q.但是,在书中写道,这个答案是不正确的:
这不正确,因为线路
id = 1 - id交换价值id之间0和1.没有机会同一方法执行两次.
我不同意.我认为上面提到的场景有一定几率.这种交换不是原子的.我错了吗?
Jon*_*eet 78
我错了吗?
不,你是绝对正确的 - 就像你的例子时间表一样.
除了它不是原子之外,不能保证写入id将被另一个线程拾取,因为没有同步且字段不是易失性的.
对于像这样的参考材料来说,这有点令人不安:(