前言
Java的ThreadLocal类能够让我们创建各个线程独有的线程变量,这个线程变量只有创建它的线程可以对它做读写操作。即使两个线程执行同一段代码,并且这个代码引用了同一个ThreadLocal变量,这两个线程也不能访问彼此的ThreadLocal变量。因此,Java 的 ThreadLocal 类以一种非常简单的方式确保了线程安全。
建议: 看这篇博客的同时,阅读一遍 java.lang.ThreadLocal 的源码,相信您从源码中获取的知识点会更多一些。
一、创建一个线程变量
我们可以通过下面这种方式创建一个ThreadLocal对象,我们还可以给它指定泛型类型,如下所示:
private ThreadLocal<String> threadLocal = new ThreadLocal<>();
这个代码只需要执行一次。然后线程就可以对它设置值(set)或者读取值(get),每个线程只能获取到它们自己设置的值。
二、设置 ThreadLocal 的值
一旦创建了ThreadLocal对象,就可以设置ThreadLocal的值,我们通过set()方法设置:
threadLocal.set("A thread local value");
三、获取 ThreadLocal 的值
通过get()方法获取ThreadLocal的值,若创建ThreadLocal对象的时候声明了泛型类型,那么获取到的对象不需要做强制转换,如下所示:
String threadLocalValue = threadLocal.get();
四、移除 ThreadLocal 的值
通过remove()方法获取ThreadLocal的值,若创建ThreadLocal对象的时候声明了泛型类型,那么获取到的对象不需要做强制转换,如下所示:
threadLocal.remove();
五、ThreadLocal 泛型
我们可以给ThreadLocal指定泛型类型,指定泛型类型之后只能设置泛型类型的值,另外,获取ThreadLocal的值时不需要做类型转换。
正如我们上面提出的示例:
//指定泛型类型为String
private ThreadLocal<String> threadLocal = new ThreadLocal<>();
//设置值
threadLocal.set("A thread local value");
//获取值
String threadLocalValue = threadLocal.get();