关于bootstrap:深入浅出ThreadLocal
ThreadLocal置信大家都有用过的,个别用作存取一些全局的信息。比方用户信息,流程信息,甚至在Spring框架外面通过事务注解Transactional去获取数据库连贯的实现上,也有它的一份功绩。ThreadLocal作为一个进阶必会知识点,而且还是面试高频考点。网上博客对它的解读也必然不会少,然而网上博客解读程度参差不齐,看多了难免会绕。不如本人亲自再梳理一遍,顺便记录下本人的解读。ThreadLocal的线程隔离性Demo先来看一个小的demostatic ThreadLocal<Student> threadLocal = new ThreadLocal<Student>(); public static void main(String[] args) { threadLocalTest1();} private static void threadLocalTest1() { new Thread(new Runnable() { public void run() { try { TimeUnit.SECONDS.sleep(3); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(threadLocal.get()); }}).start();new Thread(new Runnable() { public void run() { try { TimeUnit.SECONDS.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); } threadLocal.set(new Student("zhangsan")); }}).start();}复制代码如代码所示,开启两个线程。第一个线程3秒之后去取在动态变量threadLocal里的变量。第二个线程1秒之后去设置threadLocal里的变量。这段代码运行的后果就是,第一个线程永远获取不到第二个线程给动态变量threadLocal里设置的变量。论断:不同的线程操作同一个threadLocal对象,能够实现线程信息之间的隔离。猜测:看到set办法和get办法,大胆猜测threadLocal对象外面有个Map,key为以后线程,value为ThreadLocal泛型里的对象,这样就实现了在空间上的线程安全性。但事实并不是这样,答案不在猜测中,而在源码中。ThreadLocal.set()办法源码解读public void set(T value) { // 获取以后线程Thread t = Thread.currentThread();// 获取以后线程的ThreadLocalMapThreadLocalMap map = getMap(t);if (map != null) // 把以后ThreadLocal对象作为key,调用set办法的入参对象作为value,放入以后线程的ThreadLocalMap map.set(this, value);else // 通过以后线程和调用set办法的入参对象去结构Map createMap(t, value);}复制代码ThreadLocal.get()办法源码解读public T get() { ...