乐趣区

关于java:ThreadLocal

I、java.lang.ThreadLocal

1、定义:ThreadLocal:线程局部变量,它通常是公有类中心愿将状态与线程关联的动态字段。ThreadLocal 提供了线程间数据隔离的性能,每个线程都会在 ThreadLocal 中保留一份该线程独有的数据,所以它是线程平安的。
2、数据结构:动态外部类 ThreadLocalMap。ThreadLocalMap:一个键值对 Map,底层是 Entry 对象数组,Entry 对象中键是 ThreadLocal 对象,值是 Object 类型的具体存储内容。

3、api:

get:get 以后线程中存储的数据;

public T get() {                       // 获取以后线程        
    Thread t = Thread.currentThread(); // 查找对应线程的 ThreadLocalMap 变量   
    ThreadLocalMap map = getMap(t);        
    if (map != null) {// 不为 null,返回以后 threadLocal 对应的 value 值                 ThreadLocalMap.Entry e = map.getEntry(this);            
        if (e != null) {@SuppressWarnings("unchecked")                
            T result = (T)e.value;               
            return result;           
        }       
     } // 以后线程的 threadLocalMap 为空,初始化        
     return setInitialValue();}    
private T setInitialValue() { // 初始化的值为 null       
    T value = initialValue();        
    Thread t = Thread.currentThread();        
    ThreadLocalMap map = getMap(t);        
    if (map != null)            
        map.set(this, value);        
    else            // 初始化以后线程的 threadLocalMap                                createMap(t, value);        
    return value;    
}    
protected T initialValue() {return null;}

set:往以后线程中 set 数据;

public void set(T value) {            // 获取以后线程        
    Thread t = Thread.currentThread();// 去查找对应线程的 ThreadLocalMap 变量 
    ThreadLocalMap map = getMap(t);        
    if (map != null)            
        map.set(this, value);        
    else // 第一次调用就创立以后线程的对应的 ThreadLocalMap            
         // 并且会将值保留进去,key 是以后的 threadLocal,value 就是传进来的值     
        createMap(t, value);    
}    
ThreadLocalMap getMap(Thread t) {return t.threadLocals;}

remove:清空线程中的数据。
4、局限性:
ThreadLocal 在线程池场景容易导致内存溢出(线程池复用线程)
无奈实现父子线程信息传递

II、java.lang.InheritableThreadLocal

III、com.alibaba.ttl.TransmittableThreadLocal

退出移动版