日期:2014-05-20  浏览次数:20829 次

关于velotile的面试题,百思不得其解中,请指导
直接上代码,可以直接运行。输入结果可能有三种情况: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();
   }
}
------解决方案--------------------
这么简单的问题,还百思不得其解?
我们如果把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);


你针对每种情况,看看最终输出值是什么,就知道了。

------解决方案--------------------
- -差点被骗了,跟velotile有毛关系,就是线程的延迟而已,executedByThread1() 这个方法说明了,当且仅当y=1时,才能为x=1。 这里陷阱就是:赋值和输出,X和Y的处于不同位置的。