public class ThreadLocalTest{
/**
* 一个ThreadLocal对象代表一个变量,故里面只能放一个数据
*/
private static ThreadLocal<Integer> x=new ThreadLocal<Integer>();
private static ThreadLocal<MyThreadScopeData> myThreadScopeData=new ThreadLocal<MyThreadScopeData>();
public static void main(String[] args) {
for (int i = 0; i <2; i++) {
new Thread(new Runnable() {
@Override
public void run() {
int data=new Random().nextInt();
System.out.println(Thread.currentThread().getName()+" has put data :" + data);
//向当前线程存入数据
x.set(data);
/*MyThreadScopeData myData=new MyThreadScopeData();
myData.setName("name"+ data);
myData.setAge(data);
myThreadScopeData.set(myData); */
MyThreadScopeData.getThreadInstance().setName("name"+ data);
MyThreadScopeData.getThreadInstance().setAge(data);
new A().get();
new B().get();
}
}).start();
}
}
static class A{
public void get() {
//从当前线程取出数据
int data=x.get();
System.out.println("A from " + Thread.currentThread().getName()+" has put data :" + data);
/*MyThreadScopeData myData=myThreadScopeData.get();
System.out.println("A from" + Thread.currentThread().getName()+"getMyData:"+myData.getName()+","+myData.getAge()); */
MyThreadScopeData myData=MyThreadScopeData.getThreadInstance();
System.out.println("A from " + Thread.currentThread().getName()+" getMyData:"+myData.getName()+","+myData.getAge());
}
}
static class B{
public void get() {
int data=x.get();
System.out.println("B from " + Thread.currentThread().getName()+" has put data :" + data);
MyThreadScopeData myData=MyThreadScopeData.getThreadInstance();
System.out.println("B from " + Thread.currentThread().getName()+" getMyData:"+myData.getName()+","+myData.getAge());
}
}
}
class MyThreadScopeData{
private MyThreadScopeData() {
}
public static /*synchronized*/ MyThreadScopeData getThreadInstance() {
//单例模式:懒汉式,多线程执行时内存中有可能出现多个值(虽然不影响程序,因为第二次会把第一次覆盖),所以加上同步锁
MyThreadScopeData instance =map.get();
if(instance==null) {
instance=new MyThreadScopeData();
map.set(instance);
}
return instance;
}
//private static MyThreadScopeData instance =null; //new MyThreadScopeData();
private static ThreadLocal<MyThreadScopeData> map=new ThreadLocal<MyThreadScopeData>();
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
多线程之线程范围内共享数据(2)
最新推荐文章于 2020-10-26 21:52:39 发布