面试题: 谈一谈对 ThreadLocal 的理解
admin
2024-02-24 07:45:02
0

目录

  • 目的
  • 资源
  • 核心结论
  • 原理
  • 代码演示
  • 其他
    • 为什么 ThreadLocalMap 中的key要设计为弱引用
  • 参考资源
    • 内存泄漏问题
    • ThreadLocals下标计算
    • 源码分析

目的

学习记录, 面试准备

资源

B站的一个讲高频面试题的一个学习视频

核心结论

线程之间资源隔离, 线程内资源共享.

原理

每个线程内有一个 ThreadLocalMap 类型的成员变量, 用来存储资源对象
① 调用 set(), 就是以 ThreadLocal 自己作为key, 资源对象作为 value, 存入到当前线程的 ThreadLocalMap 中
② 调用 get(), 就是以 ThreadLocal 自己作为key, 到当前线程中查找关联的资源值
③ 调用 remove(), 就是以 ThreadLocal 自己作为key, 移除当前线程关联的资源值

代码演示

/*** TestThreadLocal: 线程之间资源隔离, 线程内资源共享** @author xiaozhengN 571457082@qq.com* @since 2022-11-27 22:12:39**/
@Slf4j
public class TestThreadLocal {public static void main(String[] args) {test1();test2();}/*** 多个线程调用, 得到的是自己的Connection对象*/private static void test1() {for (int i = 0; i < 5; i++) {new Thread(() -> log.info("当前线程: {}, Connection: {}", Thread.currentThread().getName(), Utils.getConnection()), "test1Thread" + (i + 1)).start();}}/*** 一个线程内调用, 得到的是同一个Connection对象*/private static void test2() {for (int i = 0; i < 3; i++) {new Thread(() -> {log.info("当前线程: {}, Connection: {}", Thread.currentThread().getName(), Utils.getConnection());log.info("当前线程: {}, Connection: {}", Thread.currentThread().getName(), Utils.getConnection());}, "test2Thread" + (i + 1)).start();}}static class Utils {// 线程隔离private static final ThreadLocal threadLocal = new ThreadLocal<>();/*** 获取连接** @return Connection对象*/public static Connection getConnection() {Connection connection = threadLocal.get();if (connection == null) {connection = innerGetConnection();threadLocal.set(connection);}return connection;}private static Connection innerGetConnection() {try {return DriverManager.getConnection("jdbc:mysql://localhost:3306/bos?useSSL=false", "root", "root");} catch (SQLException e) {throw new RuntimeException(e);}}}
}

其他

为什么 ThreadLocalMap 中的key要设计为弱引用

① Thread 可能需要长时间运行(如线程池中的线程), 如果 key 不再使用, 需要 GC 去回收.
② 但 GC 仅仅是释放 key 可内存, 后续还要根据 key 是否为 null 来进一步释放value的内存, 释放时机如下:
2.1 获取 key 发现 null key
2.2 set key时, 会使用启发式扫描, 清除临近的 null key, 启发次数与元素个数, 是否发现null key有关
2.3 remove时(推荐), 因为一般使用 ThreadLocal 时都把它作为静态变量, 因此 GC 无法回收.

参考资源

内存泄漏问题

ThreadLocal内存泄漏

ThreadLocals下标计算

一个特殊的常量 0x61c88647
0x61c88647

源码分析

源码走读

相关内容

热门资讯

小猿淘金APP非法期货交易骗局...   小猿淘金等平台在多个网络渠道投放广告,以“5元即可投资”等低门槛宣传吸引投资者开户操作。然而,经...
拇指订购APP炒白银铂金期货交...   拇指订购APP的交易模式存在严重问题。平台虽宣传为“订购交易”,但其实际操作完全照搬期货交易机制...
掌上工美APP、工美有色APP...   掌上工美APP、工美有色APP、工美黄金APP存在巨大的非法期货骗局,在这些平台的投资者基本都是...
南昌闲置金饰变现 回收金项链需... 随着近年黄金价格持续波动,不少持有闲置黄金首饰的居民都有变现需求,回收金项链是其中较为常见的业务类型...
原创 7... 昨天刷到日本三菱电机的动向有点荒诞:这家做家电的巨头最近牵头搞了个回收项目,每年拆23万台废旧家用空...
公募FOF基金经理展望下半年:... ◎记者 陈玥 2026年上半年,全球市场在流动性宽松与产业趋势共振的驱动下,上演了一出“冰火两重天”...
全市场规模最大ETF易主!黄金... 截至7月6日收盘,全亚洲规模最大的黄金ETF标的——黄金ETF华安(518880)报8.63元,本月...
上半年IPO申报放量升温,科创... 2026年上半年的IPO市场,在6月迎来了集中交卷。Wind数据显示,上半年三大交易所合计新增受理I...
管好养老钱壮大耐心资本 保险资... 段国圣,理学硕士,工学博士,经济学博士后,数学副教授,应用经济学研究员(教授)。深耕保险投资30余年...
惠州A股上市公司一年半市值翻倍... 每经记者:孔泽思 每经编辑:袁东 |2026年7月7日 星期二| NO.1 深圳集成电路产业去年营收...
植物性饮食的新课题:荷兰研究揭... 周末的家常餐桌上,一家人尝试用植物性替代品替代肉鱼和奶制品,孩子吃得香,老人也在细嚼慢咽中尝试豆类与...
周一(7月6日),美股行业ET... 周一(7月6日),美股行业ETF多数收涨,全球科技股指数ETF涨2.18%,半导体ETF涨2.03%...
想在吉林做卤味加盟怎么判断企业... 有意向了解卤味加盟的创业者,往往首先关注合作企业的专业度,当前休闲卤味消费市场规模稳步增长,不同企业...
华府消息|北约盟友经历从奉承特... (来源:华府圈内) 今天是《华府消息》连续更新的第2218天 7月4日独立日烟花表演期间,纽约布鲁克...
兴财说 | A股风格高低切换,... (来源:兴华基金) ►►► 权益市场表现 01 市场表现回顾 数据来源:iFinD,统计区间:20...
加息押注削弱 黄金白银连续上涨 (来源:金砖汇通) 贵金属分析 现货黄金交投于4130美元附近,美联储9月加息押注下降推动金价走高...
SpaceX“二把手”官宣向“... 转自:财联社 财联社7月7日讯(编辑 赵昊)SpaceX总裁兼首席运营官格温·肖特韦尔(Gwynne...
沈阳茅台回收怎么挑选合规的回收... 随着国内礼品消费市场的发展,不少居民手中都持有闲置的高端礼品,包括名酒、黄金、奢侈品等,有变现需求的...
北京再开店 沃尔玛试水“平价山... (来源:北京商报) 沃尔玛想要翻开新篇章。近日,北京商报记者从沃尔玛中国独家获悉,公司正在北京积极推...
午盘:美股涨跌不一 科技股推动... 来源:环球市场播报 北京时间7月7日晚,美股周一午盘涨跌不一,科技股普涨推动纳指走高。市场关注的焦点...