为什么 ThreadLocal 可以做到线程隔离?

关注者
158
被浏览
77,030

34 个回答

之所以 ThreadLocal 可以做到线程隔离,是因为有操作系统的支持,在 x86(32/64) 上,通过 fs/gs 寄存器指向线程控制块,从而可以实现每个线程有各自私有的存储空间,就是 ThreadLocal 。其它平台上,也是通过类似的方式来实现(专门的寄存器来指向线程控制块)。

ThreadLocal 的性能可以非常高,相比普通全局变量只多一次间接访问,但是这种 ThreadLocal 必须静态分配。为了在灵活性与性能之间折衷,ELF 有 4 种 ThreadLocal 模型(太长不看) ,简单点说就是除静态分配 ThreadLocal 最快,其它的都慢。

使用 ThreadLocal 的目的一般有两种:

  1. 业务需求线程级的作用域/生存期
  2. 提升性能(减少写写/读写冲突,降低甚至消除锁需求)