并发工具类之ThreadLocal——小结
ThreadLocal
使用场景
每个线程需要一个独享的对象,通常是个工具类
每个线程内需要保存全局变量,可让不同方法使用,避免传参的麻烦
使用Thread的好处
- 达到线程安全
- 不需要加锁,提高执行效率
- 更高效地利用内存,节省开销
- 免去传参的繁琐
Thread原理
每个ThreadLocal对象中都有一个ThreadLocalMap成员变量
主要方法
-
InitialValue()
-
返回当前线程对应的初始值,延迟加载,只有在调用了get()才会触发
-
除非线程先前调用了set方法,在这种情况下,不会为线程调用initalvalue方法
-
通常每个线程最多调用一次这个方法,如果调用了remove(),在get(),才会再次调用
-
get()
-
remove()
使用注意
-
内存泄漏:当某个对象不再使用,但占用的内存却不能回收
1.key是弱引用(继承),会被gc回收掉
2.而value = v;这种则是强引用,正常情况下,当线程终止,保存在threadlocal里的value会被gc
3.如果线程一直不终止(线程池),那么key对应的value就不能回收
4.jdk已考虑到这种情况,在set,remove,rehash方法里会扫描key为null的Entry,并把对应的value设置为null -
保存的map和map中的key和value是保存在Thread类中的
如何避免?阿里规约
使用完threadlocal后,调用remove方法