概述
ThreadLocal是一个本地线程副本变量工具类。主要用于将私有线程和该线程存放的副本对象做一个映射,各个线程之间的变量互不干扰。在高并发场景下,可以实现无状态的调用,适用于各个线程不共享变量值的操作。- 内部使用静态内部类
ThreadLocalMap存储每个线程变量副本的方法,key存储的是当前线程的ThreadLocal对象,value就是当前ThreadLocal对应的线程变量的的副本值。
提供方法
T get()返回此线程局部变量的当前线程副本中的值。protected T initialValue()返回此线程局部变量的当前线程的“初始值”。线程第一次使用get()方法访问变量时将调用此方法,但如果线程之前调用了set(T)方法,则不会对该线程再调用initialValue方法。通常,此方法对每个线程最多调用一次,但如果在调用get()后又调用了remove(),则可能再次调用此方法。void remove()移除此线程局部变量当前线程的值。void set(T value)将此线程局部变量的当前线程副本中的值设置为指定值。
怎嘛使用
1 | public class ThreadLocalTest { |
源码分析
set()方法
1 | public void set(T value) { |
ThreadLocalMap内部类
1 | static class ThreadLocalMap { |
- 源码中可以看出
ThreadLocalMap依靠Entry来存储ThreadLocal和副本值,key就是ThreadLocal,value就是ThreadLocal的变量副本值。Entry集成WeakReference,说明是一个弱引用关系。当一个对象仅仅被弱引用指向, 而没有任何其他强引用指向的时候, 如果这时GC运行, 那么这个对象就会被回收,不论当前的内存空间是否足够,这个对象都会被回收。
1 | //获取与ThreadLocal关联的Thread中的ThreadLocal。 |
ThreadLocal是包含在Thread类中的
ThreadLocalMap的set方法
1 | private void set(ThreadLocal<?> key, Object value) { |
get()操作
1 | public T get() { |
参考:http://cmsblogs.com/?p=2442
