总结:当一个主线程声明Threadlocal时,threadlocal会将局部变量变存入threadlocalmap中,threadlocalmap是thread中的变量,其中key为当前线程对象,当前key会指向threadlocal。此时使用的是弱引用,如果是强引用,当threadlocal不再被主线程所引用时,gc进行回收操作时无法回收threadlocal会导致第一次内存泄露。但是回收之后,key值为null,value不为null,此时依旧会导致内存泄露,所以需要手动的调取set,remove等方法触发回收操作,这些方法会清除threadlocalmap中key数组Entry[]中从i到末尾上key = null的数据。
- threadlocal被主线程强引用一次,threadlocalmap软引用一次,一旦强引用消失,threadlocalmap中指向threadlocal的弱引用也就无法让threadlocal不被回收,此时threadlocal也就不会造成内存泄露。
- threadlocal在每个线程中都是同一个实例,线程所私有的threadlocalmap,由threadlocal控制。
- threadlocal在确认一个新的threadlocalmap的时候使用的自旋锁 (不知道是不是)
- 弱引用与强引用通常是并存的,通常使用在容器中。一般一个容器会被一个主使用对象调用,此时是强引用关系,而容器与自身元素的调用关系则应该是弱引用关系。因为决定容器本生是否存在的意义来自于主使用对象是否继续使用,当主使用者不再使用时,容器本身就应该被销毁,而不应该因为容器内元素引用而继续存在,不然就是内存泄露
以上观点纯属个人总结,如有错漏之处敬请指正