可以通过ThreadLocal在同一个线程,不同的组件中传递公共变量。每个线程的变量都是独立的,不会相互影响。
使用示例
public class MyThead {
ThreadLocal<String> stringThreadLocal = new ThreadLocal<>();
private String name;
public String getName() {
return stringThreadLocal.get();
}
public void setName(String name) {
stringThreadLocal.set(name);
}
public static void main(String[] args) {
MyThead myThead = new MyThead();
for(int i = 0; i < 5; i++){
new Thread(new Runnable() {
@Override
public void run() {
myThead.setName( Thread.currentThread().getName());
System.out.println(Thread.currentThread().getName() + ":" + myThead.getName());
}
}, "线程" + i).start();
}
}
}
//输出:
//线程0:线程0
//线程1:线程1
//线程2:线程2
//线程3:线程3
//线程4:线程4
以上这个场景如果使用synchronized会降低性能,ThreadLocal有更高的并发性
synchronized:采用以时间换空间的方式,只提供了一份变量,让不同的线程排队访问
ThreadLocal:采用以空间换时间的方式,为每个线程提供了一个变量的副本,从而实现同时访问而相互不干扰
ThreadLocal的实现
每个Thread内部都有一个ThreadLocalMap
Map的key是ThreadLocal对象,value是线程的变量副本
ThreadLocal负责向map获取和设置线程的变量值