ThreadLocal 是什么呢?
定义:提供线程局部变量; 一个线程局部变量在多个线程中,分别有独立的值(副本)。
特点:简单(开箱即用)、快速(无额外开销)、安全(线程安全)。
场景: 多线程场景(资源持有、线程一致性、并发计算、线程安全等场景)。
ThreadLocal 基本API
构造函数ThreadLocal<T>()
初始化initialValue()
访问器get/set
回收 remove
public class ThreadLocalTest { public static ThreadLocal<String> s = new ThreadLocal<String>(){ @Override protected String initialValue(){ System.out.println("Initial Value run ........."); return Thread.currentThread().getName(); } }; public static void main(String[] argv){ System.out.println(s.get()); s.set("good"); System.out.println(s.get()); } }
结果:
Initial Value run .........
main
good
Process finished with exit code 0
1.initialValue只执行了一次,而且需要调用get()方法去触发。
下面的代码会让你更好的理解:一个线程局部变量在多个线程中,分别有独立的值(副本)
public class ThreadLocalTest { public static ThreadLocal<String> s = new ThreadLocal<String>(){ @Override protected String initialValue(){ System.out.println("Initial Value run ........."); return Thread.currentThread().getName(); } }; public static void main(String[] argv){ System.out.println(s.get()); s.set("good"); new Thread(){ @Override public void run(){ System.out.println(s.get()); } }.start(); System.out.println(s.get()); } }
结果:
Initial Value run ......... main good Initial Value run ......... Thread-0 Process finished with exit code 0
结果里面的
good 是代码 最后一行的输出。
在不同的线程里, 使用了get() 会触发 其initialValue方法。在另外的线程set值,不会影响其他线程。
故 一个线程局部变量在多个线程中,分别有独立的值(副本)