读了一些资料都说threadLocal有脏数据问题,理解了下书上和博客的意思做了个简单的例子,希望对大家理解上有帮助,如果有问题可以指出。
问题场景:
1.threadLocal脏数据是在线程池的场景会出现,因为threadLocal是线程的独有的
2.当A线程调用了ThreadLocal的Set方法后,并没有调用remove方法,此时A线程的数据没有被清理
4.在使用线程池创建线程的时候,如果并发数大于线程池个数时,线程池就会使B复用A线程,从而获得了A线程Set的值。
解决办法
每次使用完调用remove方法即可,也避免了内存溢出的情况,内存溢出的原因就不在这分析了
测试代码
1.创建一个容量为5的线程池,并发开启10个线程操作
2.在计数器为1的时候调用当前线程的set方法,其他9个线程只调用get方法
3.可以发现被复用的线程,value并没有随着线程回收,而销毁value