关于velotile的面试题,百思不得其解中,请指导

darian_li 2014-05-02 01:55:33
直接上代码,可以直接运行。输入结果可能有三种情况:1,1/0,0/0,1 但惟独不可能为1,0. 请问为什么。

public class VelotileTest {
public static volatile int x = 0; // Reads and writes to this variable are atomic.
public static int y = 0;

public static void executedByThread1() {
y = 1;
x = 1; // "happens before" action
}

public static void executedByThread2() {
int r1 = x;
int r2 = y;
System.out.println(r1 + ", " + r2);
}

public static void main(String... args) throws InterruptedException {
Thread t1 = new Thread(new Runnable() {
public void run() {
executedByThread1();
}
});

Thread t2 = new Thread(new Runnable() {
public void run() {
executedByThread2();
}
});

t1.start();
t2.start();

t1.join();
t2.join();
}
}
...全文
177 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
JevonCode 2014-05-02
  • 打赏
  • 举报
回复
- -差点被骗了,跟velotile有毛关系,就是线程的延迟而已,executedByThread1() 这个方法说明了,当且仅当y=1时,才能为x=1。 这里陷阱就是:赋值和输出,X和Y的处于不同位置的。
darian_li 2014-05-02
  • 打赏
  • 举报
回复
这里如果去掉velotile关键字,打印结果都一样,为什么会出现这个情况呢。
rumlee 2014-05-02
  • 打赏
  • 举报
回复
这么简单的问题,还百思不得其解? 我们如果把thread1和thread2两个线程合并起来之后,赋值的执行顺序可能有一下几种情况。 最后一句的输出输出的是局部变量,所以可以不用考虑它的顺序。 -----------------1------------------ y = 1; x = 1; int r1 = x; int r2 = y; System.out.println(r1 + ", " + r2); -----------------2------------------ int r1 = x; int r2 = y; y = 1; x = 1; System.out.println(r1 + ", " + r2); -----------------3------------------ y = 1; int r1 = x; x = 1; int r2 = y; System.out.println(r1 + ", " + r2); -----------------4------------------ y = 1; int r1 = x; int r2 = y; x = 1; System.out.println(r1 + ", " + r2); -----------------5------------------ int r1 = x; y = 1; int r2 = y; x = 1; System.out.println(r1 + ", " + r2); -----------------6------------------ int r1 = x; y = 1; x = 1; int r2 = y; System.out.println(r1 + ", " + r2); 你针对每种情况,看看最终输出值是什么,就知道了。

62,621

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧