![](https://csdnimg.cn/release/download_crawler_static/503184/bg1.jpg)
早在 Java 1.2 推出之时,Java 平台中就引入了一个新的支持:java.lang.ThreadLocal,给我
们在编写多线程程序时提供了一种新的选择。使用这个工具类可以很简洁地编写出优美的
多线程程序,虽然 ThreadLocal 非常有用,但是似乎现在了解它、使用它的朋友还不多。
ThreadLocal 是什么
ThreadLocal 并非是一个线程的本地实现版本,它并不是一个 Thread,而是 thread local
variable(线程局部变量)。也许把它命名为 ThreadLocalVar 更加合适。线程局部变量
(ThreadLocal)其实的功用非常简单,就是为每一个使用该变量的线程都提供一个变量值
的副本,是每一个线程都可以独立地改变自己的副本,而不会和其它线程的副本冲突。从
线程的角度看,就好像每一个线程都完全拥有该变量。线程局部变量并不是 Java 的新发明,
在其它的一些语言编译器实现(如 IBM XL FORTRAN)中,它在语言的层次提供了直接的
支持。因为 Java 中没有提供在语言层次的直接支持,而是提供了一个 ThreadLocal 的类来
提供支持,所以,在 Java 中编写线程局部变量的代码相对比较笨拙,这也许是线程局部变
量没有在 Java 中得到很好的普及的一个原因吧。
ThreadLocal 的设计
首先看看 ThreadLocal 的接口:
Object get() ;
// 返回当前线程的线程局部变量副本 protected Object initialValue(); // 返回该线程局部变量的
当前线程的初始值
void set(Object value);
// 设置当前线程的线程局部变量副本的值
ThreadLocal 有 3 个方法,其中值得注意的是 initialValue(),该方法是一个 protected 的方法,
显然是为了子类重写而特意实现的。该方法返回当前线程在该线程局部变量的初始值,这
个方法是一个延迟调用方法,在一个线程第 1 次调用 get()或者 set(Object)时才执行,并且
仅执行 1 次。ThreadLocal 中的确实实现直接返回一个 null:
protected Object initialValue() { return null; }
ThreadLocal 是如何做到为每一个线程维护变量的副本的呢?其实实现的思路很简单,在
ThreadLocal 类中有一个 Map,用于存储每一个线程的变量的副本。比如下面的示例实现:
评论0