下面经过一个例子来证实经过ThreadLocal能达到在每一个线程中建立变量副本的效果:java
public class TestThreadLocal { public static ThreadLocal<String> threadLocal = new ThreadLocal<>(); public static void main(String []args){ threadLocal.set("hello world"); Thread thread = new Thread(new Runnable() { @Override public void run() { System.out.println("thread:"+threadLocal.get()); } }); thread.start(); System.out.println("main:"+threadLocal.get()); } }
控制台输出:数据库
main:hello world thread:null
ThreadLocal相关类图结构:ide
Thread类中有一个ThreadLocalMap类型的变量threadLocals。threadLocals用来存储实际的变量副本,key为当前ThreadLocal变量,value为变量副本。线程
初始化时,在Thread中threadLocals变量为null,只有当前线程第一次调用Thread的set()或get()方法thread中threadLocal进行初始化,而且以当前ThreadLocal变量为key,以ThreadLocal要保存的副本变量为value,存到threadLocals。若是要获取副本变量,经过ThreadLocal的get方法。code
ThreadLocal最多见的使用场景是用来解决数据库链接、Session管理等。blog