文章目录
一、什么是 ThreadLocal
ThreadLocal类顾名思义可以理解为线程本地变量。也就是说如果定义了一个ThreadLocal, 每个线程往这个ThreadLocal中读写是线程隔离,互相之间不会影响的,主要用来解决线程内资源的共享,
比如,让100个人填写个人信息表,如果只有一支笔,那么大家就得挨个填写,对于管理人员来说,必须保证大家不会去哄抢这仅存的一支笔,否则,谁也填不完。
从另外一个角度出发,我们可以准备100支笔,人手一支,那么所有人很快就能完成表格的填写工作。如果说锁使用的是第一种思路,那么 ThreadLocal 使用的就是第二种思路。
锁就是通过控制资源的访问,而ThreadLocal是 通过增加资源来保证所有对象的线程安全
这也被叫做数据隔离,保证只有在线程内才能获取到对应的值,线程外不能访问。
线程的隔离特性:
- Synchronized 是通过线程等待,牺牲时间来解决访问冲突
- ThreadLocal 是通过每个线程单独一份存储空间,牺牲空间来解决冲突
二、ThreadLocal 的应用场景
实际开发中我们真正使用ThreadLocal的场景还是比较少的,大多数使用都是在框架里面。
比如 Spring 采用 Threadlocal 的方式,来保证单个线程中的数据库操作使用的是同一个数据库连接
日常使用如果某些数据是以线程为作用域并且不同线程有不同的数据副本时,