java.lang.ThreadLocal
提供了一种解决多线程并发问题的新思路。
官方 API 文档描述如下:
This class provides thread-local variables. These variables differ from their normal counterparts in that each thread that accesses one (via its get or set method) has its own, independently initialized copy of the variable. ThreadLocal instances are typically private static fields in classes that wish to associate state with a thread (e.g., a user ID or Transaction ID).
中文翻译:
此类提供了线程局部(thread-local)变量。这些变量不同于他们的普通副本之处在于,每个线程都可以通过 get 或 set 方法存取自己的局部变量,每个线程的局部变量都是独立于该变量的初始化副本。ThreadLocal 实例在所属类中通常是 private static 类型属性,以此希望将状态和某一线程关联起来。
ThreadLocal
并非线程的本地实现,也不是线程,而是“线程局部变量”。使用 ThreadLocal
维护变量时,ThreadLocal
会为每个使用该变量的线程提供一个独立的副本,因此每个线程都可以独立使用和修改自己的副本而不影响其它并发线程对应的副本。
从线程角度出发,每个线程都有一个对应的局部变量副本,通过 ThreadLocal
存取的数据总是与当前线程相关,JVM 为每个运行线程绑定了私有的本地实例存储空间,从而为多线程并发访问提供了隔离机制。
ThreadLocal
中定义了一个静态内部类 ThreadLocalMap
,ThreadLocalMap
是一个定制的 Hash Map,只适用于维护线程局部变量,存储每个线程对应的变量副本。ThreadLocalMap
实现了键值对的读取和设置。每个线程都有一个独立的 ThreadLocalMap
副本,其所存储的值只能被当前线程存取。ThreadLocal
通过操作每个线程持有的 ThreadLocalMap
副本实现并发线程中对统一变量存取的隔离。
(待续)