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