ThreadLocal

I、java.lang.ThreadLocal

1、定义:ThreadLocal:线程局部变量,它通常是私有类中希望将状态与线程关联的静态字段。ThreadLocal提供了线程间数据隔离的功能,每个线程都会在ThreadLocal中保存一份该线程独有的数据,所以它是线程安全的。
2、数据结构:静态内部类ThreadLocalMap。ThreadLocalMap: 一个键值对Map,底层是Entry 对象数组,Entry对象中键是ThreadLocal对象,值是Object类型的具体存储内容。
ThreadLocal_第1张图片
3、api:
ThreadLocal_第2张图片
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

你可能感兴趣的:(java)