ThreadLocal为每个使用该变量的线程提供独立的变量副本,所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本。
public class ThreadLocal2 {
/*volatile static Person p = new Person();*/
private static ThreadLocal<Person1> tl = new ThreadLocal<>();
public static void main(String[] args) {
new Thread(() -> {
try {
TimeUnit.SECONDS.sleep(2);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println(tl.get());
}).start();
new Thread(() -> {
try {
TimeUnit.SECONDS.sleep(1);
} catch (Exception e) {
e.printStackTrace();
}
tl.set(new Person1());
}).start();
}
}
class Person1 {
String name = "zhangsan";
}
ThreadLocal是使用空间换时间,synchronized是使用时间换空间。比如在hibernate中session就存在与ThreadLocal中,避免synchronized的使用
运行上面的程序,理解ThreadLocal。
ThreadLocal只对当前线程范围有效。
深入理解ThreadLocal,请阅读下面文章
ThreadLocal源码解读