ThreadLocal
ThreadLocal是线程的局部变量,它可以为变量在每个线程中创建不同的副本,每个线程可以访问自己内部的变量。
实现分析
ThreadLocal用map存储变量副本,支持存储多个副本,同时为了提升效率让变量副本跟随线程保存,这个map就是ThreadLocalMap。
ThreadLocalMap
ThreadLocalMap跟随Thread保存,key就是ThreadLocal,一个ThreadLocalMap可以有多个指向ThreadLocal的entry。
下图所示:
ThreadLocalMap虽然定义在ThreadLocal类中,但被声明在Thread类中。
常见问题
引发内存泄漏
ThreadLocalMap的key是弱引用,当没有强引用关联ThreadLocal时,gc会回收key,此时ThreadLocalMap中会存在一条key为null的entry。
如果不主动清理,ThreadLocalMap中就会始终存在key为null的entry。
ThreadLocal为了处理key为null的entry,在某些情况下,调用get()、set()方法时会调用expungeStateEntry()方法清理。remove()方法会直接清理这种entry。