1. 是什么

2. 能干嘛

3. 底层原理

%%
▶3.🏡⭐️◼️【🌈费曼无敌🌈⭐️第一步⭐️】◼️⭐️-point-20230413-1620%%
❕ ^ac6t1x

image.png

3.1. 关系


3.2. Thread 和 ThreadLocal

3.3. ThreadLocal 和 ThreadLocalMap

3.4. 弱引用 -2 个问题⭐️🔴

3.4.1. 为什么要用弱引用

%%
▶1.🏡⭐️◼️【🌈费曼无敌🌈⭐️第一步⭐️】◼️⭐️-point-20230607-1156%%
❕ ^t7yb2u


%%
▶1.🏡⭐️◼️【🌈费曼无敌🌈⭐️第一步⭐️】◼️⭐️-point-20230320-2241%%
❕ ^kqn4wd

3.4.2. 为什么要手动 remove- 内存泄露 - 线程池重复使用⭐️🔴

ThreadLocal 被回收为 null 之后,ThreadLocalMap 的 Entry 的 key 指向的是 null,这个结构的回收也是一个需要解决的问题。

3.4.3. 引用

3.4.3.1. 强引用

3.4.3.2. 软引用

3.4.3.3. 弱引用

3.4.3.4. 虚引用

虚引用使用案例:性能调优-进阶-1、JVM-GC调优

4. 代码分析

4.1. expungeStaleEntry

JDK 中提供了清理脏 Entry 的方法,需要手动调用一下

5. 应用总结

5.1. Spring 事务

面试专题-2、Spring-事务

5.2. 线程上下文传递

userId,traceId

5.3. 数据库连接管理

Mybatis 中 SqlSession 存储当前线程的数据库会话信息

6. 实战经验

6.1. 用户身份鉴别

https://www.bilibili.com/video/BV1rK4y1C7fv?p=240&spm_id_from=pageDriver&vd_source=c5b2d0d7bc377c0c35dbc251d95cf204

6.2. 回收♻️

6.2.1. get

get(“a”):如果索引位置 key 为 null,则会添加 key:a,value:null

6.2.2. set

启发式扫描,key 附近的为 null key 也会被释放

6.2.3. remove

但是我们使用的时候,往往将 ThreadLocal 设置为静态的,所以即使栈中的引用断掉,ThreadLocal 与所在类也是强引用的,所以 get 和 set 方法无法释放,还是需要手动 remove 才能彻底解决问题。 %%
▶2.🏡⭐️◼️【🌈费曼无敌🌈⭐️第一步⭐️】◼️⭐️-point-20230320-2305%%
❕ ^og72jf

6.3. 最佳实践⭐️🔴

7. 总结

8. 参考与感谢

8.1. 周阳

8.1.1. 视频

https://www.bilibili.com/video/BV1ar4y1x727?p=111&vd_source=c5b2d0d7bc377c0c35dbc251d95cf204

8.1.2. 资料

1
013-DemoCode/thread0308

8.2. 黑马

https://www.bilibili.com/video/BV1zr4y117JM?p=93&spm_id_from=pageDriver&vd_source=c5b2d0d7bc377c0c35dbc251d95cf204