ThreadLocal类的get方法 1publicT get() {2Thread t =Thread.currentThread();3ThreadLocalMap map = getMap(t);//获取线程t中的ThreadLocalMap4if(map !=null) {5ThreadLocalMap.Entry e = map.getEntry(this);//获取entry,见代码16if(e !=null) {7@SuppressWarnings("unchecked")8T result =(T)e...
获取当前线程,并获取当前线程的散列映射,也就是存储value的地方,根据当前散列映射判断键值对是否存在,不存在则说明未初始化,之后调用getEntry方法获取ThreadLocalMap的entry,也就是存放键和值的地方,至于这个键值是什么,后面再看,如果没有拿到,就同时去进行初始化setInitialvalue. 1.2.setInitialValue初始化方法 在一开始...
get方法中,我们第一步获取当前的线程Thread,然后getMap返回当前Thread中的ThreadLocalMap对象。 如果Map不为空,则取出以当前ThreadLocal为key对应的值。 如果Map为空,则调用初始化方法: 代码语言:javascript 复制 private T setInitialValue() { T value = initialValue(); Thread t = Thread.currentThread(); Threa...
初始时,在Thread里面,threadLocals为空,当通过ThreadLocal变量调用get()方法或者set()方法,就会对Thread类中的threadLocals进行初始化,并且以当前ThreadLocal变量为键值,以ThreadLocal要保存的副本变量为value,存到threadLocals。 然后在当前线程里面,如果要使用副本变量,就可以通过get方法在threadLocals里面查找 ...
1、ThreadLocal 的成员方法 2、小案例: public class ThreadLocalDemo { static ThreadLocal<String> threadLocal = new ThreadLocal<>(); static void print(String str) { //打印当前线程中本地内存中本地变量的值 System.out.println(str + ":" + threadLocal.get()); ...
ThreadLocal类中的关键set()方法: public void set(T value) { Thread t = Thread.currentThread(); //获取当前线程t ThreadLocalMap map = getMap(t); //根据当前线程获取到ThreadLocalMap if (map != null) //如果获取的ThreadLocalMap对象不为空 map.set(this, value); //K,V设置到ThreadLocalMap...
get方法不复杂,获取当前线程的ThreadLocalMap,调用 map.getEntry(this)方法,key就是ThreadLocal本身,根据hash值,计算数组下标,取出数组元素。 3..ThreadLocal的remove方法分析 remove与get类似,找到对应数组位置,进行清除,e.clear()方法将对象引用置位null,注意最后调用了一个expungeStaleEntryf方法,这个就是清除数组中...
在上面的代码中,我们进行了ThreadLocal的初始化赋值,然后看下withInitial方法。 所以是当调用get方法时,才会触发赋值的操作,那么我们看下get方法。 如果当前线程的局部变量没有值,返回初始化方法初始的值。 所以对于我们来说就是SuppliedThreadLocal#initialValue返回的值。