定义

ThreadLocal 提供线程局部变量;一个线程局部变量在多个线程中分别有独立的值(副本)

产生背景

用于多线程场景,避免一致性问题

一致性问题:

  1. 发生在多个主体对同一份数据无法达成共识。
  2. 包括:分布式一致性问题、并发问题等。
  3. 特点:场景多、问题复杂、难以察觉---需要严密的思考甚至数学论证。

一致性问题解决办法:

  1. 排队(例如:锁synchronized、互斥量、管程、屏障等)
  2. 投票(例如:Paxos,Raft等)
  3. 避免(例如:ThreadLocal等 空间换时间的方式)

实现细节

ThreadLocal模型:
image.png

使用场景

线程资源持有

在一个用户一个线程的情况下,用户数据使用ThreadLocal存储,其他程序模块可以方便地拿到分配给当前线程的用户的数据,全局获取,减少编程难度.
image.png

线程资源一致性

以JDBC为例,一个事务分为多个Part,它们在同一个线程中(如Spring响应池中分配的一个线程)请求获取一个数据库连接,将会得到同一个JDBC连接.这样的好处是一个JDBC连接维护了事务的状态,相同事务多次获取连接可以拿到同一个JDBC连接.ThreadLocal帮助需要保持线程一致的资源(如数据库事务)维护一致性,降低编程难度.
image.png

线程安全

在以前C语言中常用setLastError()getLastError(),多线程下就需要ThreadLocal保证一致性.ThreadLocal帮助只考虑了单线程的程序库,无缝向多线程场景迁移.
image.png

分布式计算

将计算任务分给不同的线程,用ThreadLocal存储本线程的计算结果,然后再汇总.

image.png


EricMa
4 声望0 粉丝

« 上一篇
Maven 快速上手