ThreadLocal原理

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中,要注意导致内存泄漏的两个前提:

  1. currentThread没用被使用完,但是 ThreadLocal已经使用完成被回收了(并且在很长一段时间没有调用该Entry(key))
  2. 没用手动remove删除这个Entry

demo1(在这个demo中,使用Usersession作为局部变量,在各个线程中,这个 变量都是 各个线程 独立开来的,但是在这里的初始化时,由于方法被多个线程调用,导致线程不安全,因此会出现usersession的value与所在的线程对应不上的情况):


threadLocal测试案例1.png

demo2:


threadLocal测试案例2.png

demo3:


ThreadLocal测试案例3.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。