1.ThreadLocal主要原理:
ThreadLocal又名线程局部变量,使变量在各个线程中进行分开
知识点:
1.现Java版本中,每个线程会有独立的ThreadLocalMap<ThreadLocal, Object>,这里要注意的是,这个Map的Key被限制为ThreadLocal类。
2.在ThreadLocalMap中,采用的是线性探测法来解决hash冲突,并且是通过每次横移1位来寻址。
3.在ThreadLocalMap中,其存储是以Entry<ThreadLocal, Object> 为单位的,其中key中的ThreadLocal采用了弱引用
4.为什么Key使用弱引用:是因为在弱引用被回收后,如果程序再次获取该Entry中的value时,会先判断Key是否为空,若key=null,则将value设置为 null,这就是Entry中Key不使用强引用的原因。
5.在 ThreadLocal中,要注意导致内存泄漏的两个前提:
- currentThread没用被使用完,但是 ThreadLocal已经使用完成被回收了(并且在很长一段时间没有调用该Entry(key))
- 没用手动remove删除这个Entry
demo1(在这个demo中,使用Usersession作为局部变量,在各个线程中,这个 变量都是 各个线程 独立开来的,但是在这里的初始化时,由于方法被多个线程调用,导致线程不安全,因此会出现usersession的value与所在的线程对应不上的情况):
demo2:
demo3: