ThreadLocal(gold_axe)

ThreadLocal(gold_axe)_第1张图片
ThreadLocal

ThreadLocal(gold_axe)_第2张图片
ThreadLocal
ThreadLocal(gold_axe)_第3张图片
ThreadLocal .ThreadLocalMap

ThreadLocalMap是Thread里面一个以ThreadLocal为key的map, 因为一个线程可能有多个ThreadLocal

给ThreadLocal实例set值就是
threadLocal.currentThread.threadLocalMap.set(threadLocal,value)

可以看到, ThreadLocal里面只需要一个field(另外一个是辅助的)就是threadLocalHashCode, 用于它在ThreadLocalMap里面当key的时候作为hash码


ThreadLocal(gold_axe)_第4张图片

ThreadLocal除了一个hash值, 就没其他状态了, 具体的值还是由线程各自保管, ThreadLocal只提供方法

内存泄漏

可以看到 ThreadLocalMap的key是一个弱引用,这是为了 如果这个ThreadLocal对象已经没有其他引用指向它了, 各个线程里面的ThreadLocalMap不会阻止这个ThreadLocal对象的回收,

虽然如此还是可能发生内存泄漏,ThreadLocal对象作为ThreadLocalMap的key确实回收了,但是它对应的value没有被回收! 会一直存在到那个线程结束!如果线程在线程池里面就永远不会结束! 永远回收不了这个没有用的value


ThreadLocal(gold_axe)_第5张图片

threadLocal.remove()一下就不会了

强引用就不会被回收
没引用的对象回收后,还是不够,就回收软引用
垃圾回收发送就会被回收
gc时通知一下

你可能感兴趣的:(ThreadLocal(gold_axe))