ThreadLocal是在开发中相对比较常见的工具类了,可以在多线程环境下保证线程安全,其基本原理就是给每一个对象都分配一个属于当前线程的私有对象,这样线程之间拿到的对象就不会相互冲突了。
可以想象成,如果多个人公用一个厕所的时候,因为厕所的一些限制,有很多的人都不能冒然的使用厕所,如果每一个人来的时候都给他一个单独的厕所这样相互之间就不会打扰了,缺点的话也很明显可以看出来就是浪费资源。所以在用完的时候要记得销毁资源。
有的人可能会问你再什么时候下使用ThreadLocal呢?
知道了原理在使用的时候考虑下,或者在对应的场景下想想能不能用ThreadLocal去做。
只是知道了其基本使用的话,相对还是不够,其内部的数据结构也很有意思,在看过之后才发现其中的巧妙。
当调用ThreadLocal的set方法时:
当有多个ThreadLocal对象时候,其实每个线程内部的ThreadLocalMap属性里面的Entry数组,对应的下标为ThreadLocal的hashCode进行取余,然后再构建Entry对象。
其实就是一个线程内部可以存储多个ThreadLocal给的线程私有对象,只不过ThreadLocal对象是访问那些线程私有对象的入口。
关于ThreadLocal如果不进行Remove是否会导致内存泄漏?
通过上面我们知道Thread中的ThreadLocalMap属性中的Entry表都是弱引用的对象,其引用为ThreadLocal对象,那么弱引用对象一般在进行垃圾回收的时候都会被回收掉。
ThreadLocal在没有外部强引用时,发生GC时会被回收,如果创建ThreadLocal的线程一直持续运行,那么这个Entry对象中的value就有可能一直得不到回收,发生内存泄露。
记得在使用ThreadLocal完毕之后,调用ThreadLocal.remove方法。