并发编程专题-基础-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 才能彻底解决问题。
❕ ^og72jf6.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!
评论