求解,为什么下面的那行输出代码不加上则两个线程得到的data都是同样的?而加上后就不同了。import java.util.Random;public class Demo4 {
public static int data=0;
public static void main(String[] args) {

for(int i=0;i<2;i++){
new Thread(new Runnable() {

@Override
public void run() {
int temp=new Random().nextInt();
System.out.println("temp="+temp);//加上这句后两个线程的data显示则不同了。为什么?
data=temp;
//这里的data两个线程显示的相同
System.out.println(Thread.currentThread().getName()+" has put data: "+data);
new A().get();
new B().get();
}
}).start();
}

for(int i=0;i<2;i++){
// System.out.println(new Random().nextInt());
}
}

static class A{
public void get(){
System.out.println("A model "+Thread.currentThread().getName()+" get data :"+data);
}
}
static class B{
public void get(){
System.out.println("B model "+Thread.currentThread().getName()+" get data :"+data);
}
}
}
java多线程

解决方案 »

  1.   

    没有人回答自己解决了。原因是创建两个线程,CPU在两个线程任务间来回切换,一开始data等于第一个随机数,后来第二个线程的随机数把data给覆盖了。而System.out.println("temp="+temp);可以延缓执行时间。我再把每次temp和data的值输出后,观察运行结果就可以理解为什么会出现上面的这种情况了。import java.util.*;public class Demo4 {
    public static int data=0;
    public static void main(String[] args) {
    final A a=new A();
    for(int i=0;i<2;i++){
    new Thread(new Runnable() {

    @Override
    public void run() {
    // synchronized (a) {
    int temp=new Random().nextInt();
    // System.out.println("temp="+data);//加上这句后两个线程的data显示则不同了。为什么?
    data=temp;
    System.out.println("temp="+temp+"  data="+data);
    //这里的data两个线程显示的相同
    System.out.println(Thread.currentThread().getName()+" has put data: "+data);
    new A().get();
    new B().get();
    // }

    }
    }).start();
    }

    }

    static class A{
    public void get(){
    System.out.println("A model "+Thread.currentThread().getName()+" get data :"+data);
    }
    }
    static class B{
    public void get(){
    System.out.println("B model "+Thread.currentThread().getName()+" get data :"+data);
    }
    }
    }