深入研究 java.lang.ThreadLocal 类
一、概述
ThreadLocal 是什么呢?其实 ThreadLocal 并非是一个线程的本地实现版本,
它并不是一个 Thread,而是 threadlocalvariable(线程局部变量)。也许把它
命名为 ThreadLocalVar 更加合适。线程局部变量 (ThreadLocal)其实的功用
非常简单,就是为每一个使用该变量的线程都提供一个变量值的副本,是 Java
中一种较为特殊的线程绑定机制,是每一 个线程都可以独立地改变自己的副本,
而不会和其它线程的副本冲突。
从线程的角度看,每个线程都保持一个对其线程局部变量副本的隐式引用,只
要线程是活动的并且 ThreadLocal 实例是可访问的;在线程消失之后,其线
程局部实例的所有副本都会被垃圾回收(除非存在对这些副本的其他引用)。
通过 ThreadLocal 存取的数据,总是与当前线程相关,也就是说,JVM 为每
个运行的线程,绑定了私有的本地实例存取空间,从而为多线程环境常出现的
并发访问问题提供了一种隔离机制。
ThreadLocal 是如何做到为每一个线程维护变量的副本的呢?其实实现的思路
很简单,在 ThreadLocal 类中有一个 Map,用于存储每一个线程的变量的副
本。
概括起来说,对于多线程资源共享的问题,同步机制采用了“以时间换空间”的
方式,而 ThreadLocal 采用了“以空间换时间”的方式。前者仅提供一份变量,
让不同的线程排队访问,而后者为每一个线程都提供了一份变量,因此可以同
时访问而互不影响。
二、API 说明
ThreadLocal()
创建一个线程本地变量。
T get()
返回此线程局部变量的当前线程副本中的值,如果这是线程第一次调用
该方法,则创建并初始化此副本。
protected T initialValue()
返回此线程局部变量的当前线程的初始值。最多在每次访问线程来获得
每个线程局部变量时调用此方法一次,即线程第一次使用 get() 方法访问变量
的时候。如果线程先于 get 方法调用 set(T) 方法,则不会在线程中再调用
initialValue 方法。
评论1