您的位置:首页 > 其它

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

2016-07-06 10:35 543 查看
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;
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息