ThreadLocal可以理解为线程本地变量,它会在每个线程都创建⼀个副本,那么在线程之间访问内部副本变量就⾏了,做到了线程之间互相隔离,相⽐于synchronized的做法是⽤空间来换时间。
ThreadLocal内,有⼀个静态内部类:ThreadLocalMap,ThreadLocalMap⼜包含了⼀个Entry数组,Entry本身是⼀个弱引⽤,它的key是指向ThreadLocal的弱引⽤,Entry具备了保存key—value键值对的能⼒。
弱引⽤的目的是为了防⽌内存泄露,如果是强引⽤那么ThreadLocal对象除⾮线程结束后,则始终⽆法被回收,弱引⽤则会在下⼀次GC的时候被回收。
但是,这样还是会存在内存泄露的问题,假如key和ThreadLocal对象被回收之后,entry中就存在key为空,但是value有值的entry对象,但是永远没办法被访问到,同样除⾮线程结束运行。
但是只要ThreadLocal使⽤恰当,在使⽤完之后调⽤remove⽅法删除Entry对象,实际上是不会出现这个问题的。
ThreadLocal引用原理
网友评论