ThreadLocal:一个线程内部的存储类,可以在指定线程内存储数据,数据存储以后,只有指定线程可以得到存储数据;
ThreadLocal提供了线程内存储变量的能力,这些变量不同之处在于每一个线程读取的变量是对应的互相独立的。通过get和set方法就可以得到当前线程对应的值;
使用方法:
static final ThreadLocal<T> sThreadLocal = new ThreadLocal<T>(); sThreadLocal.set() sThreadLocal.get()
get、set方法:
//set 方法 public void set(T value) { //获取当前线程 Thread t = Thread.currentThread(); //实际存储的数据结构类型 ThreadLocalMap map = getMap(t); //如果存在map就直接set,没有则创建map并set if (map != null) map.set(this, value); else createMap(t, value); } //getMap方法 ThreadLocalMap getMap(Thread t) { //thred中维护了一个ThreadLocalMap return t.threadLocals; } //createMap void createMap(Thread t, T firstValue) { //实例化一个新的ThreadLocalMap,并赋值给线程的成员变量threadLocals t.threadLocals = new ThreadLocalMap(this, firstValue); }
每个线程持有一个ThreadLocalMap对象;
为了解决多线程中相同变量的访问冲突问题;
示例:
public class ThreadLocalTest { static ThreadLocal<String> threadLocal = new ThreadLocal<>(); public static void main(String[] args) { //在main线程中添加main线程的本地变量 threadLocal.set("mainVal"); //新创建一个子线程 Thread thread = new Thread(new Runnable() { @Override public void run() { System.out.println("子线程中的本地变量值:"+threadLocal.get()); } }); thread.start(); //输出main线程中的本地变量值 System.out.println("mainx线程中的本地变量值:"+threadLocal.get()); } }
输出:
mainx线程中的本地变量值:mainVal
子线程中的本地变量值:null