ThreadLocal是用来提供本地线程变量的,也就是你创建了一个ThreadLcoal变量,那么访问这个变量的每个线程都会有这个变量的副本.当多个线程操作这个变量,实际操作的是自己本地内存里面的变量.
ThreadLocal的实现原理:
- ThreadLocal是由map实现的.为什么使用map而不是使用其他数据结构呢?因为每个线程可以关联多个ThreadLocal
- ThreadLocal的数据存放在线程的threadLocals变量中,存放在线程的内存中,所以ThreadLcoal只是一个空壳
- ThreadLocal不支父子线程之间的数据传递
public class ThreadLocalTest {
static ThreadLocal<String> threadLocal=new ThreadLocal<>();
static void print(String str){
System.out.println(str+":"+threadLocal.get());
threadLocal.remove();
}
public static void main(String[] args) {
// new Thread(()->{
// threadLocal.set("哈哈哈哈哈哈");
// print("threadOne");
// System.out.println("threadOne remove after :"+threadLocal.get());
// }).start();
//
//
// new Thread(()->{
// threadLocal.set("uyayyayya");
// print("threadTwo");
// System.out.println("threadTwo remove after :"+threadLocal.get());
// }).start();
// 设置线程变量
threadLocal.set("hello world");
Thread thread = new Thread(() -> {
System.out.println("thread:" + threadLocal.get());
});
thread.start();
try {
thread.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("main thread:"+threadLocal.get());
}
}