ThreadLocal一般称为线程本地变量,它是一种特殊的线程绑定机制,将变量与线程绑定在一起,为每一个线程维护一个独立的变量副本。通过ThreadLocal可以将对象的可见范围限制在同一个线程内。
举个栗子:一个线程中更改了名字,另外一个线程立即能够看到
public class ThreadLocal1 {
volatile static Person p = new Person();
public static void main(String[] args) {
new Thread(() -> {
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
// TODO: handle exception
e.printStackTrace();
}
System.out.println(p.name);
}).start();
new Thread(() -> {
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e2) {
// TODO: handle exception
}
p.name = "lisi";
}).start();
}
}
//class Person{
// String name = "zhangsan";
//}
现在需求变为:各个线程中使用的名字互不干扰。
在这种情况下可以使用ThreadLocal类
public class ThreadLocal2 {
static ThreadLocal<Person> tl = new ThreadLocal<>();
public static void main(String[] args) {
new Thread(() -> {
try {
TimeUnit.SECONDS.sleep(2);
} catch (InterruptedException e) {
// TODO: handle exception
e.printStackTrace();
}
System.out.println(tl.get());
}).start();
new Thread(() -> {
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e2) {
// TODO: handle exception
}
tl.set(new Person());
}).start();
}
}
class Person{
String name = "zhangsan";
}
关于ThreadLocal的底层原理和源码解析以后有时间会再分享,希望小伙伴们多多关注!