package cn.dandan.test; |
import java.util.HashMap; |
import java.util.Map; |
import java.util.Random; |
public class ThreadLocalTest { |
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() |
+ " get 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() |
+ " get 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; |
} |
} |