ThreadLocal的remove()方法的實例


/**
 * @Description:
 * @author: fdy
 * @date: 2020/2/14 17:40
 */
public class DirtyDataInThreadLocal {
    public static ThreadLocal<String> threadLocal = new ThreadLocal<String>();
    public static void main(String[] args) {
       // 使用固定大小為1的線程池,說明上一個的線程屬性會被下一個線程屬性復用
        ExecutorService pool = Executors.newFixedThreadPool(5);
        for (int i = 0; i < 20; i++) {
            Mythead mythead = new Mythead();
            pool.execute(mythead);
        }
    }

    private static class Mythead extends Thread{
        private static boolean flag = true;

        @Override
        public void run() {
            if (flag){
                // 第一個線程set后,並沒有進行remove
                // 而第二個線程由於某種原因沒有進行set操作
                threadLocal.set(this.getName()+", session info.");
                flag = false;
            }

            System.out.println(this.getName()+" 線程是 "+threadLocal.get());
            threadLocal.remove();
            // 但是由於ThreadLocal沒有在線程處理結束時及時進行remove清理操作
            // 在高並發場景下,線程池中的線程屬性會被下一個線程屬性復用
        }
    }
}

高並發下threadLocal.get()的結果為隨機

結果: 

Thread-0 線程是 Thread-0, session info.
Thread-4 線程是 Thread-4, session info.
Thread-1 線程是 null
Thread-2 線程是 null
Thread-3 線程是 null


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM