/** * @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
