当前位置: 首页 > 后端技术 > Java

ThreadLocal_0

时间:2023-04-01 22:35:14 Java

I,java.lang.ThreadLocal1,定义:ThreadLocal:线程局部变量,通常是私有类中的一个静态字段,希望将状态与线程相关联。ThreadLocal提供了线程间数据隔离的功能。每个线程都会在ThreadLocal中保存一份本线程独有的数据,因此是线程安全的。2.数据结构:静态内部类ThreadLocalMap。ThreadLocalMap:一个键值对Map,底层是一个Entry对象数组,Entry对象中的key是一个ThreadLocal对象,value是Object类型的具体存储内容。3.api:get:获取当前线程中存储的数据;publicTget(){//获取当前线程Threadt=Thread.currentThread();//找到对应线程的ThreadLocalMap变量ThreadLocalMapmap=getMap(t);if(map!=null){//不为null,返回当前threadLocal对应的值ThreadLocalMap.Entrye=map.getEntry(this);if(e!=null){@SuppressWarnings("unchecked")T结果=(T)e.value;返回结果;}}//当前线程的threadLocalMap为空,初始化returnsetInitialValue();}privateTsetInitialValue(){//初始化值为空Tvalue=initialValue();线程t=Thread.currentThread();ThreadLocalMapmap=getMap(t);if(map!=null)map.set(this,value);else//初始化当前线程的threadLocalMapcreateMap(t,value);r返回值;}protectedTinitialValue(){返回空值;}set:在当前线程中设置数据;publicvoidset(Tvalue){//获取当前线程Threadt=Thread.currentThread();//找到对应的ThreadLocalMap变量ThreadLocalMapmap=getMap(t);if(map!=null)map.set(this,value);else//第一次调用会创建当前线程对应的ThreadLocalMap//并保存value回车,key为当前threadLocal,value为createMap(t,value)中传入的value;}ThreadLocalMapgetMap(Threadt){返回t.threadLocals;}remove:清除线程中的数据4.局限性:ThreadLocal在线程池场景中容易导致内存溢出(线程池重用线程)无法实现父子线程信息传递II、java.lang.InheritableThreadLocalIII、com.alibaba.ttl.TransmittableThreadLocal