ThreadLocal
- 线程本地存储机制,可以把数据缓存到该线程中,只要是该线程执行的方法,就可以随时获取缓存的数据。
- ThreadLocal是用ThreadLocalMap实现的,每个线程都会有一个ThreadLocalMap,key为ThreadLocal,value为要缓存的值
- 一个线程可以有多个ThreadLocal
- 如果在线程池中使用ThreadLocal 会造成内存溢出,在线程池中的线程会一直存在,所以ThreadLocalMap就会一直存在,里面的ThreadLocal的value就会一直存在,继续使用该线程就会一直在ThreadLocalMap中添加value,从而造成内存溢出,可以在使用的时候手动调用remove方法,来删除ThreadLocalMap中的ThreadLocal的value
public static void main(String[] args) throws InterruptedException {
new Thread(()->{
ThreadLocal t = new ThreadLocal();
ThreadLocal t1 = new ThreadLocal();
t.set("AA");
t1.set("t1");
try {
TimeUnit.SECONDS.sleep(3);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+":"+t.get());
System.out.println(Thread.currentThread().getName()+":"+t1.get());
t1.remove();
System.out.println(Thread.currentThread().getName()+":"+t1.get());
},"线程A").start();
new Thread(()->{
ThreadLocal t = new ThreadLocal();
t.set("BB");
try {
TimeUnit.SECONDS.sleep(3);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+":"+t.get());
},"线程B").start();
}