有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Java线程本地weakReference

当我自己尝试这段代码时。我得到的结果是,有一个没有GC的三行输出和一行接一行的GC输出。我不知道输出weak ref key:java.lang.ThreadLocal@21fe5cee,value:java.lang.ref.SoftReference@4d544ec9weak ref key:java.lang.ThreadLocal@79658094,value:java.lang.ref.SoftReference@168ce1d8来自哪里,并且在源代码中没有找到任何相关操作,有人能帮我解释一下吗

顺便说一下,我注意到ThreadLocal中的nextHashCodeAtomicInteger。有人能帮忙弄清楚为什么它应该是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) 个答案