这个方法是 ThreadLocal 类中的方法,本质上调用的是 ThreadLocal 内部类 ThreadLocalMap 里面的 getEntry() 方法。/** * Returns the value in the current thread's copy of this * thread-local variable. If the variable has no value for the * current thread, it is first initialized to the val...
1.在ThreadLocal get,set 的时候顺带把散列表中的无效entry 置空,并且把这些entry 的 value也置空,以便value被回收,也就是执行清扫操作 2.在ThreadLocal remove 的时候把对应槽位上的 entry 置空,并且把这 个entry 的 value也置空,以便value被回收。顺便执行清扫操作。 get,set 方法真的能保证内存不泄露么?
1privateEntry getEntryAfterMiss(ThreadLocal<?> key,inti, Entry e) {2Entry[] tab =table;3intlen =tab.length;45while(e !=null) {//从i位置开始遍历,寻找key能对应上的entry6ThreadLocal<?> k =e.get();7if(k ==key)8returne;9if(k ==null)10expungeStaleEntry(i);//遇到key为null的entry...
它是 ThreadLocal 对象,它有两个引用源,一个是栈内存上的 ThreadLocal Ref,一个是 Entry 中的 ...
public T get() { Thread t = Thread.currentThread(); ThreadLocalMap map = getMap(t); if (map != null) { ThreadLocalMap.Entry e = map.getEntry(this); if (e != null) return (T)e.value; } return setInitialValue(); } 在调用map.getEntry(this)时,内部会判断key是否为null,继续看ma...
使用多个 ThreadLocal,不是每次都使用 remove 方法,并且把一个ThreadLocal对应的所有强应用置空之前只调用过 get, set方法,调用get,set方法可以防止内存泄漏。 为了打破这一假设,模拟内存泄漏的情况,举以下极端的例子: 先规定: 1.一开始都是有效的entry,并且每个entry的key通过散列算法后算出的位置都是自己所在的位...
//根据threadLocal对象从map中获取Entry对象 ThreadLocalMap.Entry e = map.getEntry(this); ...
get() == key) return e; else return getEntryAfterMiss(key, i, e); } 这个get方法没什么好说的,就是用threadLocal的hash值去找table的下坐标,没有找到直接循环数组找。好了ThreadLocalMap的核心逻辑就分析到这。 接下来看ThreadLocal核心源码 public void set(T value) { // 拿到当前线程 Thread t...
那么就来看看ThreadLocal仅有的三个public的实例成员方法,也就是get、set、remove,它们三个方法最后实际上会调用ThreadLocalMap的getEntry、set、remove这三个方法。 getEntry有可能通过getEntryAfterMiss调到expungeStaleEntry;set有可能调到replaceStaleEntry也有可能通过cleanSomeSlots调到expungeStaleEntry也有可能通过rehash调到...
换句话说,正常的情况是不会出现内存泄露的,但是如果我们没有调用ThreadLocal对应的set、get、remove方法就不会把对应的value和Entry设置为null,这样就可能会出现内存泄露情况。 那如何避免内存泄露的情况呢?那就是我们在不使用的时候就调用一下ThreadLoca的remove方法,来加快垃圾回收,避免内存泄露。