ThreadLocal用于多线程下,按照线程为每个线程开辟一个储存空间,储存一个为Object类型的值,这个值是线程隔离,达到存入和取出的值,是和该线程绑定的。
ThreadLocal为什么可以设置为static?
为了多线程并发时节约空间,如果是设置为static,那么在并发时ThreadLocal对象在虚拟机加载时已经完成加载,并且多个线程自己的ThreadLocalMap都使用同一个ThreadLocal对象作为自己的Key,所以如果项目Spring项目,并且已经设置该类为singleton(单例),就不用设置为static
鸡肋的弱引用
ThreadLocal的entity的KEY对ThreadLocal的引用,之所以使用弱引用,是因为我们在使用中,如果在ThreadLocal tl = new ThreadLocal()的tl指向其他变量后,不需要手动释放掉堆里面原先的tl指向的ThreadLocal对象,因为ThreadLocalMap的eneity的key对堆里面的ThreadLocal是弱引用,发生gc的时候,自动释放掉原先tl指向的ThreadLocal对象,但是在实际生产中,我们一般对于tl对象使用都是当作全局变量,而且不会改变其引用对象,所以在实际生产中,弱引用对项目空间优化意义不大。
是否需要remove?
之所以需要remove,是为了防止内存泄露,但是在使用过程中,很多时候ThreadLocal的value对象在的remove的时候,都是在代码的finally的时候处理,也就是项目的最后去remove,然后线程结束,如果是这个逻辑,个人觉得对于并发量不是很大的项目,不用remove也可以,因为线程结束时这个ThreadLocalMap也没有,相当于一个是先remove后线程结束,则清空ThreadLocalMap,而不remove是线程结束直接清空ThreadLocalMap,但是作为使用ThreadLocal的标准,remove应该作为一个好习惯去处理