多线程并发神器--ThreadLocal

什么是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应用比较普遍,若是不是滥用,利是大于憋的。

推荐去个人博客阅读更多:

1.Java JVM、集合、多线程、新特性系列教程

2.Spring MVC、Spring Boot、Spring Cloud 系列教程

3.Maven、Git、Eclipse、Intellij IDEA 系列工具教程

4.Java、后端、架构、阿里巴巴等大厂最新面试题

以为不错,别忘了点赞+转发哦!

相关文章
相关标签/搜索