ThreadLocal-从源码角度简单分析 (3)

当我们使用完ThreadLocal后没有调用set/get/remove方法,那么可能会导致失效内存不能及时被回收,导致内存泄露,尤其是在value占用内存较大的情况。

所以最佳实践是,在明确ThreadLocal不再使用时,手动调用remove方法及时清空。

总结

ThreadLocal 并不解决线程间共享数据的问题

ThreadLocal是通过让线程内的ThreadLocalMap.Entry的key指向自身,来实现了对线程内对象的引用,从而可以在线程内方便的使用变量。同时因为操作的都是线程内的变量,也避免了实例线程安全的问题

ThreadLocal 适用于变量在线程间隔离且在方法间共享的场景

ThreadLocalMap 的 Entry 对 ThreadLocal 的引用为弱引用,避免了 ThreadLocal 对象无法被回收的问题

ThreadLocalMap 的 set 方法通过调用 cleanSomeSlots 方法回收键为 null 的 Entry 对象的值(即失效实例)从而防止内存泄漏(其它的remove,get类似)

在明确ThreadLocal不再使用时,手动调用remove方法及时清空

参考

正确理解Thread Local的原理与适用场景

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwgdyg.html