上一节使用共享变量的方式实现了变量与线程绑定的情景,本节使用JDK自己提供的ThreadLocal对象更便捷的实现变量与线程绑定的情景
import java.util.Random;
/**
*线程范围内的共享变量 ThreadLocal
*/
public class ThreadTest2 {
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()+" put data :"+data);
User user=User.instance();
user.setAge(data);
user.setUserName(Thread.currentThread().getName());
new A().get();
new B().get();
}
}).start();
}
}
static class A{
public void get(){
User user=User.instance();
System.out.println("A:"+Thread.currentThread().getName()+"["+user.getUserName()+","+user.getAge()+"]");
}
}
static class B{
public void get(){
User user=User.instance();
System.out.println("A:"+Thread.currentThread().getName()+"["+user.getUserName()+","+user.getAge()+"]");
}
}
}
class User{
private User(){};
/**
* 每个线程绑定一个User对象
* @return
*/
public static User instance(){
User user=threadLocal.get();
if(user==null){
user=new User();
threadLocal.set(user);
}
return user;
}
private static ThreadLocal<User> threadLocal=new ThreadLocal<User>();
private String userName;
private int age;
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}