ThreradLocal叫做線程本地變量,主要作用在于為變量在每一個(gè)獨(dú)立的線程創(chuàng)建一個(gè)副本,使得每個(gè)線程都可以訪問自己的內(nèi)部的變量副本,不會(huì)影響其他線程。
//ThreadLocal提供的方法
public T get()
public void set(T value)
public void remove()
protected T initialValue()
ThreadLocal如何為每個(gè)線程創(chuàng)建變量的副本
- 在每個(gè)線程Thread內(nèi)部有一個(gè)ThreadLocal.ThreadLocalMap類型的成員變量threadLocals,這 個(gè)threadLocals就是用來存儲(chǔ)實(shí)際的變量副本的,鍵值為當(dāng)前ThreadLocal變量,value為變量副本(即T 類型的變量)
- 初始時(shí),在Thread里面,threadLocals為空,當(dāng)通過ThreadLocal變量調(diào)用get()方法或者set()方法, 就會(huì)對(duì)Thread類中的threadLocals進(jìn)行初始化,并且以當(dāng)前ThreadLocal變量為鍵值,以ThreadLocal 要保存的副本變量為value,存到threadLocals。
- 然后在當(dāng)前線程里面,如果要使用副本變量,就可以通過get方法在threadLocals里面查找
/**
* @author:wangjie
* @create:2022-09-20 16:58
* @Description:
*/
public class ThreadLocalConfig {
private static ThreadLocal<Long> id = new ThreadLocal<>();
private static ThreadLocal<String> name = new ThreadLocal<>();
public static void set(){
id.set(Thread.currentThread().getId());
name.set(Thread.currentThread().getName());
}
public static Long getLong(){
return id.get();
}
public static String getString(){
return name.get();
}
public static void main(String[] args) {
ThreadLocalConfig.set();
System.out.println(ThreadLocalConfig.getLong());
System.out.println(ThreadLocalConfig.getString());
new Thread(){
@Override
public void run() {
ThreadLocalConfig.set();
System.out.println(ThreadLocalConfig.getLong());
System.out.println(ThreadLocalConfig.getString());
}
}.start();
}
}
結(jié)果

image.png