原理:当你new 一个Thread类的时候,thread里面都有一个成员变量叫threadlocals,他是一个Map 当执行set方法时候,就把这个Threadlocal对象当作Key,new Person(要存进Threadlocal的对象)当作Value 存进这个Map中,每个线程都有这个Map,那么就好像每个人有自己的口袋一样,装到自己口袋里,自然不会被其他线程拿到。
可以看到这个Key存的是ThreadLocal的引用,而且是一个弱引用,为什么是弱引用?? 反证:若他是强引用,外面有一个tl是强引用,当外部这个tl强引用没了,那么这个Key如果是强引用的话,因为有一些线程他是24小时不断的,所以说这个threadlocals引用不消失,那么key这个引用也不消失,而若他是强引用的话,那么这个ThreadLocal对象不被使用了,确无法被GC回收,造成内存泄漏