Java -- Thread -- Collection -- 5线程范围内共享变量的概念与作用

线程范围内共享数据图解:

代码演示:

class ThreadScopeShareData
{
    //三个模块共享数据,主线程模块和AB模块
    private static int data = 0;    //准备共享的数据
    //存放各个线程对应的数据
    private Map<Thread, Integer> threadData = new HashMap<Thread, Integer>();
    public static void main(String[] args)
    {    //创建两个线程
        for (int i=0; i<2; i++)
        {
        new Thread(
                new Runnable()
                    {
                    public void run()
                        { //现在当前线程中修改一下数据,给出修改信息
                        data = new Random().nextInt();
                        SOP(Thread.currentThread().getName()+将数据改为+data);
                        //将线程信息和对应数据存储起来
                        threadData.put(Thread.currentThread(), data);
                       //使用两个不同的模块操作这个数据,看结果
                        new A().get();
                        new B().get();
                            }
                    }
                ).start();
            }
        }
    static class A
    {
        public void get()
        {
          data = threadData.get(Thread.currentThread());
            SOP(A+Thread.currentThread().getName()+拿到的数据+data);
            }
        }
    static class B
    {
        public void get()
        {
          data = threadData.get(Thread.currentThread());
            SOP(B+Thread.currentThread().getName()+拿到的数据+data);
            }
        }
}

结果并没与实现线程间的数据同步,两个线程使用的是同一个线程的数据。要解决这个问题,可以将每个线程用到的数据与对应的线程号存放到一个map集合中,使用数据时从这个集合中根据线程号获取对应线程的数据。代码实现:上面红色部分

程序中存在的问题:获取的数据与设置的数据不同步

                Thread-1共享数据设置为:-997057737

                Thread-1--A 模块数据:-997057737

                Thread-0共享数据设置为:11858818

                Thread-0--A 模块数据:11858818

                Thread-0--B 模块数据:-997057737

                Thread-1--B 模块数据:-997057737

最好将Runnable中设置数据的方法也写在对应的模块中,与获取数据模块互斥,以保证数据同步

 

holder

 

posted on 2016-04-24 19:43  yeatschen  阅读(108)  评论(0)    收藏  举报

导航