- 什么是threadlocal?为每个线程提供一个独立变量副本来解决共享变量并发访问安全的问题。
- threadlocal 的实现原理?
结构是这样的:每一个Thread 维护一个ThreadLocalMap映射表,key是ThreadLocal, value 就是真正存储的Object,ThreadLocal本身并不存储值,而是作为一个key来让线程从ThreadLocalMap获取值,并且key是弱引用,弱引用在GC时会被回收。
- 你在项目中是如何使用的?在使用SimpleDateFormat会用到,因为SimpleDateFormat是继承DateFormat的,而DateFormat中包含一个Calendar全局变量,在使用其对日期进行parse时,会调用calendar.clear() 和 calendar.set() ,Calendar里并没有线程安全机制,并且不是原子性的,因此多个线程同时操作会引起calendar混乱。
- ThreadLocal 的内存泄漏问题?ThreadLocalMap 使用 ThreadLocal 作为key,ThreadLocal为弱引用,当没有外部引用时,发生GC时,会被回收,这时ThreadLocalMap就会出现key为null的Entry,如果此时线程迟迟不结束,那么就可能造成内存泄漏。ThreadLocalMap里面已经考虑到这种情况了,可以使用remove方法来移除key为null的Entry。
- 为什么ThreadLocalMap 要使用ThreadLocal 这个弱引用作为key?1. 假设使用强引用,那么当ThreadLocal 使用的是强引用,那么当没有外部引用时,会造成ThreadLocal 迟迟得不到回收,使得内存泄漏
2.使用弱引用,当ThreadLocal使用的是弱引用,那么当没有外部引用时,ThreadLocalMap持有ThreadLocal的弱引用,即使ThreadLocal 没有使用,也会被回收,但是会在下一次调用set,get,remove时删除key为null的Entry。因此内存泄漏的根源是存在key为null的entry,而不是因为弱引用造成内存泄漏。
- ThreadLocal 最佳实践每次使用完就要调用remove来移除key为null的entry。
参考文章 : https://www.jianshu.com/p/5a7a88e62309
https://zhuanlan.zhihu.com/p/56214714
文章评论