码迷,mamicode.com
首页 > 编程语言 > 详细

ThreadLocal实现线程范围的共享变量

时间:2016-07-06 18:50:13      阅读:180      评论:0      收藏:0      [点我收藏+]

标签:threadlocal   threadlocal实现线程范围的共享变量   

ThreadLocal实现线程范围的共享变量


 用于实现线程内的数据共享,即对于相同的程序代码,多个模块在同一个线程中运行时要共享一份数据,而在另 外线程中运行时又共享另外一份数据。换一句话说就是为每一个使用该变量的线程都提供一个变量值的副本,是每一个线程都可以独立地改变自己的副本,而不会和其它线程的副本冲突。从线程的角度看,就好像每一个线程都完全拥有该变量。


使用方法举例:

public class ThreadLocalTest {

private static   ThreadLocal<String> x = new ThreadLocal<String>();  


// 启动两个线程

public static void main(String[] args) {

   new Thread(new Runnable() {

        @Override

        public void run() {

          

            // 现在当前线程中修改一下数据,给出修改信息

            String data = "AAAAAA";

            

            // 将线程信息和对应数据存储起来

            x.set(data);

            System.out.println(Thread.currentThread().getName() + 

                                     has put data :" + data);

           

            new A().get();

            new B().get();

          

        }

    }).start();

    new Thread(new Runnable() {

        @Override

        public void run() {

          

            // 现在当前线程中修改一下数据,给出修改信息

            String data = "BBBBBBB";

            

            // 将线程信息和对应数据存储起来

            x.set(data);

            System.out.println(Thread.currentThread().getName() + 

                                          " has put data :" + data);

            new A().get();

            new B().get();

          

        }

    }).start();


  }


static class A {

    public void get() {

        String data = x.get();

        System.out.println("A from " + 

                                   Thread.currentThread().getName()

                               " get data :" + data);

    }

}


static class B {

    public void get() {

        String data = x.get();

        System.out.println("B from " + 

                                       Thread.currentThread().getName()

                                   " get data :" + data);

    }

}


}

注意:一个ThreadLocal代表一个变量,故其中只能存放一个数据,如果有多个数据需要共享,则要定义一个对象,然后把对象存入ThreadLocal。


封装多个参数的例子:

class MyThreadScopeData{

private String name;

private int age;


private static ThreadLocal<MyThreadScopeData> map =

                                new ThreadLocal<MyThreadScopeData>();


private MyThreadScopeData(){};


public static MyThreadScopeData getThreadInstance(){

MyThreadScopeData instance = map.get();

if(instance == null){

instance = new MyThreadScopeData();

map.set(instance);

}

return instance;

}


}






本文出自 “德泽无忧” 博客,请务必保留此出处http://dezewuyou.blog.51cto.com/2628602/1796487

ThreadLocal实现线程范围的共享变量

标签:threadlocal   threadlocal实现线程范围的共享变量   

原文地址:http://dezewuyou.blog.51cto.com/2628602/1796487

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!