什么是ThreadLocal
能够理解成线程本地变量,传统的线程对一个变量操做时操做的是同一个对象,也存在线程安全的问题。java
ThreadLocal是一个变量的本地副本,线程对变量的操做不会影响其余线程。面试
首先看看ThreadLocal的类结构数据库
其中可重写的方法有如下几个后端
initialValue():ThreadLocal初始化的值,新建ThreadLocal的通常要重写给个初始的值。安全
get():获取当前线程变量的副本值。session
set(T value):设置、更新当前线程上的变量副本值。多线程
remove():移除当前线程上的变量副本。架构
ThreadLocal使用
新建ThreadLocal,类型为User,并初始化为tom,12岁,启动3个线程,每一个线程循环3次,休眠1少,主线程再输出。工具
输出结果以下spa
从结果可见每一个线程使用的是各自线程的变量副本,并无影响其余线程和主线程,实现了线程隔离的效果。
使用场景
通常用来解决数据库链接、用户session管理等。
内存泄露问题
若是线程的执行周期过长可能致使内存泄露的风险,虽然线程执行完后会ThreadLocal也会随着销毁,但最好使用完后加上remove这样会加快内存的释放,通常来讲线程周期不长是不太会引发内存泄露的。还有若是定义了ThreadLocal又不用也有问题,由于每次ThreadLocal的get/set/remove操做都会清理无效的key加快内存释放。ThreadLocal应用比较普遍,若是不是滥用,利是大于憋的。
推荐去个人博客阅读更多:
2.Spring MVC、Spring Boot、Spring Cloud 系列教程
3.Maven、Git、Eclipse、Intellij IDEA 系列工具教程
以为不错,别忘了点赞+转发哦!