并发编程专题-基础-18、ThreadLocal
1. 是什么

2. 能干嘛

3. 底层原理
❕ ^ac6t1x

3.1. 关系



3.2. Thread 和 ThreadLocal

3.3. ThreadLocal 和 ThreadLocalMap



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

3.4.1. 为什么要用弱引用
❕ ^t7yb2u

❕ ^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. 用户身份鉴别
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 才能彻底解决问题。 ❕ ^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 | |
8.2. 黑马

本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Taylor!
评论


