ThreadLocal用于提供线程的局部变量,在多线程环境里,每个线程的局部变量独立于其他线程的局部变量。也就是说 ThreadLocal 可以为每个线程创建一个【单独的变量副本】,相当于线程的 private static 类型变量。
ThreadLocal 的作用和同步机制有些相反:同步机制是为了保证多线程环境下数据的一致性;而 ThreadLocal 是保证了多线程环境下数据的独立性。
举个例子,看代码:
public static void main(String[] args) {
string="main";
threadLocal.set("main");
Thread thread =new Thread(new Runnable() {
public void run() {
string="thread";
threadLocal.set("thread");
System.out.println("子线程的string变量值为:"+string);
System.out.println("子线程的threadLocal变量值为:"+threadLocal.get());
}
});
thread.start();
try {
thread.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("主线程的string变量值为:"+string);
System.out.println("主线程的threadLocal变量值为:"+threadLocal.get());
}
}
在上面的类中有两个变量,一个是普通的String变量,一个是ThreadLocal类型的变量,分别在主线程和子线程中给它们赋值,结果如下:
从结果中可以看到普通的String变量在不同的线程中会被改变,也就是多个线程对于这个变量有相互间的影响,而ThreadLocal类型的变量则保证了多个线程之间变量的独立性。