当前位置:编程学习 > JAVA >>

线程共享数据诡异问题

求解,为什么下面的那行输出代码不加上则两个线程得到的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 多线程 --------------------编程问答-------------------- 有没有人帮忙解释一下? --------------------编程问答-------------------- 跪求大神。。。 --------------------编程问答-------------------- 没有人回答。。。自己解决了。原因是创建两个线程,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);
}
}
}
--------------------编程问答-------------------- 创建两个线程,同一时刻访问哪个是随机的,所以线程间尽量避免数据共享、后来的线程读到的是前面线程改过的数据 这类问题。 --------------------编程问答-------------------- 资源分配是随机的,你无法操控的
补充:Java ,  Java SE
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,