Clean ThreadLocals详解编程语言

A method to clean ThreadLocal

   private void cleanThreadLocals() { 
        try { 
            // Get a reference to the thread locals table of the current thread 
            Thread thread = Thread.currentThread(); 
            Field threadLocalsField = Thread.class.getDeclaredField("threadLocals"); 
            threadLocalsField.setAccessible(true); 
            Object threadLocalTable = threadLocalsField.get(thread); 
 
            // Get a reference to the array holding the thread local variables inside the 
            // ThreadLocalMap of the current thread 
            Class threadLocalMapClass = Class.forName("java.lang.ThreadLocal$ThreadLocalMap"); 
            Field tableField = threadLocalMapClass.getDeclaredField("table"); 
            tableField.setAccessible(true); 
            Object table = tableField.get(threadLocalTable); 
 
            // The key to the ThreadLocalMap is a WeakReference object. The referent field of this object 
            // is a reference to the actual ThreadLocal variable 
            Field referentField = Reference.class.getDeclaredField("referent"); 
            referentField.setAccessible(true); 
 
            for (int i=0; i < Array.getLength(table); i++) { 
                // Each entry in the table array of ThreadLocalMap is an Entry object 
                // representing the thread local reference and its value 
                Object entry = Array.get(table, i); 
                if (entry != null) { 
                    // Get a reference to the thread local object and remove it from the table 
                    ThreadLocal threadLocal = (ThreadLocal)referentField.get(entry); 
                    threadLocal.remove(); 
                } 
            } 
        } catch(Exception e) { 
            // We will tolerate an exception here and just log it 
            throw new IllegalStateException(e); 
        } 
    }

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/20631.html

(0)
上一篇 2021年7月19日
下一篇 2021年7月19日

相关推荐

发表回复

登录后才能评论