A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 康大玮 中级黑马   /  2012-5-24 13:01  /  1665 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

package cn.itcast;


import java.util.HashMap;
import java.util.Map;
import java.util.Random;

public class ThreadScopeShareData2 {

        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

3 个回复

倒序浏览
线程不同步问题,在用多线程时经常碰到,你可以多次运行试试每次结果不一定一样(不仅仅是数字不一样,你时候死就知道了)。就这次的结果给你分析一下。你主函数运行时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,于是就得到你所得的结果。
回复 使用道具 举报
两个线程操作同一个变量肯定是需要同步的
一个线程必须同时完成put get get操作,否则第二个线程put只有 第一个线程get的就是第二个线程产生的随机数,显然你不愿意出现这种结果
回复 使用道具 举报

import java.util.HashMap;
import java.util.Map;
import java.util.Random;

public class ThreadScopeShareData2 {

        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);
                 }               
        }
}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马