-
介绍
ThreadLocal是一个基础类,用来提供线程本地变量,从而保证线程安全。 -
用法
-
创建,需要提供变量类型
ThreadLocal<T> threadLocal = new ThreadLocal<>();
-
设置值,将变量值存储在当前线程中
threadLocal.set(T value)
-
获取值,获取当前线程中变量值
threadLocal.get()
-
清空值,清空当前线程中变量值
threadLocal.remove();
-
初始值,获取线程中变量的初始值,一般为null
threadLocal.initialValue();
-
-
原理
用一张图来简单说明ThreadLocal内的运转机制,如下图所示。
如图所示,当线程通过ThreadLocal对象操作线程本地变量时,实际上是通过ThreadLocalMap对象,ThreadLocal在内部只是维护了一个ThreadLocalMap对象引用,ThreadLocalMap对象仍存储在当前线程中。
ThreadLocalMap对象中key为ThreadLocal对象,value为线程本地变量值。 -
线程安全
每个线程均维护一个ThreadLocalMap对象(完成初始化后),ThreadLocal的值操作(get\set\remove)均操作当前线程中的ThreadLocalMap对象,因此不存在线程安全问题。
PS:
ThreadLocal以一种很特殊的方式完成了线程隔离,即在每个线程中都创建一个变量副本,互不干扰。
参考书籍及网址:
- jdk1.8官方源码
PS:研究基于MAC+Idea+JDK1.8 64位
Keep Calm and Carry on!