private 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() {
data = new Random().nextInt();
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 from " + Thread.currentThread().getName()
+ " get data :" + data);
}
}
static class B{
public void get(){
System.out.println("B from " + Thread.currentThread().getName()
+ " get data :" + data);
}
}
}
为什么会出现这样的结果:
Thread-0 has put data :1647591390
A from Thread-0 get data :-266051942
B from Thread-0 get data :-266051942
Thread-1 has put data :-266051942
A from Thread-1 get data :-266051942
B from Thread-1 get data :-266051942作者: 袁培育 时间: 2012-5-26 10:51
线程不同步问题,在用多线程时经常碰到,你可以多次运行试试每次结果不一定一样(不仅仅是数字不一样,你时候死就知道了)。就这次的结果给你分析一下。你主函数运行时for循环开启一个线程Thread-0并获得一个随机数1647591390,并输出Thread-0 has put data :1647591390,这时Thread-0失去执行权,主线程执行第二次for循环,又开启一个线程Thread-1获得一个随机数,注意因为data时静态的所以这时的data是由Thread-1随机出来的即-266051942,这时Thread-0获得执行权,输出A from Thread-0 get data :-266051942 B from Thread-0 get data :-266051942;然后Thread-1获得执行权输出A from Thread-0 get data :-266051942 B from Thread-0 get data :-266051942,于是就得到你所得的结果。作者: 张晨 时间: 2012-5-26 13:03
两个线程操作同一个变量肯定是需要同步的
一个线程必须同时完成put get get操作,否则第二个线程put只有 第一个线程get的就是第二个线程产生的随机数,显然你不愿意出现这种结果 作者: 乔建国 时间: 2012-5-26 14:07
private static int data = 0;
public static void main(String[] args) {
for(int i=0;i<2;i++){ //这里控制启动两条线程
new Thread(new Runnable(){ //创建Thread类对象, 将Runnable对象传入Thread的构造函数中
@Override
public void run() {
data = new Random().nextInt(); //伪随机地生成并返回一个 int 值
System.out.println(Thread.currentThread().getName() //获取线程名称
+ " has put data :" + data);
new A().get(); // 通过对象调用A类中的get()方法;
new B().get(); // 通过对象调用B类中的get()方法;
}
}).start(); //调用Thread对象的start()方法就可以开启一条新线程, 新线程中执行Runnable的run()方法
}
}
static class A{ //创建静态内部类A
public void get(){
System.out.println("A from " + Thread.currentThread().getName()
+ " get data :" + data);
}
}
static class B{ //创建静态内部类B
public void get(){
System.out.println("B from " + Thread.currentThread().getName()
+ " get data :" + data);
}
}
}