实际上 ThreadLocalMap 中使用的 key 为 ThreadLocal 的弱引用,弱引用的特点是,如果这个对象只存在弱引用,那么在下一次垃圾回收的时候必然会被清理掉。所以如果 ThreadLocal 没有被外部强引用的情况下,在垃圾回收的时候会被清理掉的,这样一来 ThreadLocalMap中使用这个 ThreadLocal 的 key 也会被清理掉。...
1//存储当前线程与变量值的映射2ThreadLocal.ThreadLocalMap threadLocals =null;34publicvoidset(T value) {5//获取当前线程6Thread t =Thread.currentThread();7//获取线程与变量值映射容器8ThreadLocalMap map =getMap(t);9//容器已存在,添加10if(map !=null)11map.set(this, value);12//首次设置线程...
publicvoidset(Tvalue){//利用当前线程获取它的threadLocals(threadLocals是一个ThreadLocalMap)Thread t=Thread.currentThread();ThreadLocalMap map=getMap(t);//如果已经初始化 那么就调用ThreadLocalMap的set()方法if(map!=null)map.set(this,value);else// 没有初始化 先进行初始化createMap(t,value);}...
在主线程中新建一个子线程,通过同一个ThreadLocal对象,在子线程中是无法获得主线程中保存的值的,通过以下例子可以看出:packageThreadLocal;classInheritable {publicstaticfinalThreadLocal<String> threadLocal=newThreadLocal<>();publicstaticvoidmain(String[] args) {...
static final ThreadLocal<String> ctx = new ThreadLocal<>(); public UserContext(String user) { ctx.set(user); } public static String currentUser() { return ctx.get(); } @Override public void close() { ctx.remove(); } } 二、ThreadLocal原理解析 ...
使用方法及原理 ThreadLocal 类接口很简单,只有 4 个方法,我们先来了解一下: void set(Object value) 设置当前线程的线程局部变量的值。 public Object get() 该方法返回当前线程所对应的线程局部变量。 public void remove() 将当前线程局部变量的值删除,目的是为了减少内存的占用,该方法是 JDK 5.0 新增的方法...
ThreadLocal 的工作原理可以从以下几个方面来理解: 内部数据结构: ThreadLocal 并没有直接将变量存储在线程对象中,而是通过一个名为ThreadLocalMap的内部类实现的。每个线程都有一个与之关联的ThreadLocalMap映射表,这个映射表以 ThreadLocal 实例作为 key,线程局部变量的值作为 value。
ThreadLocal 的实现原理主要依赖于线程的本地变量表。每个线程在创建时都会分配一个本地变量表,用于存储线程特有的数据。当线程访问一个 ThreadLocal 变量时,ThreadLocal 会根据当前线程的标识从本地变量表中获取对应的变量副本。如果本地变量表中不存在该变量副本,则会创建一个新的副本并存储到本地变量表中。由于每...