Java线程本地weakReference
当我自己尝试这段代码时。我得到的结果是,有一个没有GC的三行输出和一行接一行的GC输出。我不知道输出weak ref key:java.lang.ThreadLocal@21fe5cee,value:java.lang.ref.SoftReference@4d544ec9
和weak ref key:java.lang.ThreadLocal@79658094,value:java.lang.ref.SoftReference@168ce1d8
来自哪里,并且在源代码中没有找到任何相关操作,有人能帮我解释一下吗
顺便说一下,我注意到ThreadLocal
中的nextHashCode
是AtomicInteger
。有人能帮忙弄清楚为什么它应该是AtomicInteger
而不是Integer
吗
非常感谢
Java版本:jdk1。八,
代码:
public class ThreadLocalDemo {
public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException, InterruptedException {
Thread t = new Thread(()->test("abc",false));
t.start();
t.join();
System.out.println("--gc after--");
Thread t2 = new Thread(() -> test("def", true));
t2.start();
t2.join();
}
private static void test(String s,boolean isGC) {
try {
new ThreadLocal<>().set(s);
if (isGC) {
System.gc();
}
Thread t = Thread.currentThread();
Class<? extends Thread> clz = t.getClass();
Field field = clz.getDeclaredField("threadLocals");
field.setAccessible(true);
Object ThreadLocalMap = field.get(t);
Class<?> tlmClass = ThreadLocalMap.getClass();
Field tableField = tlmClass.getDeclaredField("table");
tableField.setAccessible(true);
Object[] arr = (Object[]) tableField.get(ThreadLocalMap);
for (Object o : arr) {
if (o != null) {
Class<?> entryClass = o.getClass();
Field valueField = entryClass.getDeclaredField("value");
Field referenceField = entryClass.getSuperclass().getSuperclass().getDeclaredField("referent");
valueField.setAccessible(true);
referenceField.setAccessible(true);
System.out.println(String.format("weak ref key:%s,value:%s", referenceField.get(o), valueField.get(o)));
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
输出:
weak ref key:java.lang.ThreadLocal@7e423898,value:abc
weak ref key:java.lang.ThreadLocal@21fe5cee,value:java.lang.ref.SoftReference@4d544ec9
weak ref key:java.lang.ThreadLocal@79658094,value:java.lang.ref.SoftReference@168ce1d8
--gc after--
weak ref key:null,value:def
共 (0) 个答案