线程共享数据诡异问题
求解,为什么下面的那行输出代码不加上则两个线程得到的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