ThreadLocal 有什么缺点

1,216 阅读1分钟

这是我参与8月更文挑战的第5天,活动详情查看:8月更文挑战

作者简介:悟空,8年一线互联网开发和架构经验,用故事讲解分布式、架构设计、Java 核心技术。《JVM性能优化实战》专栏作者,开源了《Spring Cloud 实战 PassJava》项目,公众号:悟空聊架构。本文已收录至 www.passjava.cn

大家好,我是悟空哥。

今天给大家带来的是大厂面试题:

ThreadLocal 有什么缺点?

面试者小空听到这题后,窃喜,这题简单。

ThreadLocal 使用场景

适用于变量在线程间隔离,而在方法或类间共享的场景。如果用户信息的获取比较昂贵(比如从数据库查询用户信息),那么在 ThreadLocal 中缓存数据是比较合适的做法。

ThreadLocal 的缺点

线程池会重用固定的几个线程,一旦线程重用,那么很可能首次从 ThreadLocal 获取的值是之前其他用户的请求遗留的值。

阿里嵩山开发手册:

【强制】必须回收自定义的ThreadLocal变量,尤其在线程池场景下,线程经常会被复用,如果不清理自定义的ThreadLocal变量,可能会影响后续业务逻辑和造成内存泄露等问题。尽量在代理中使用try-finally块进行回收。

正例:

objectThreadLocal.set(userInfo);

try{ 
    // ...
}
finally{ 
    objectThreadLocal.remove();
}

小空听完后,叹了一口气,今天又是被面试官吊打的一天。