十、Threadlocal
1、 基础知识
(1)强引用:
特点:非常强硬,挤不出去。要么被回收,要么内存溢出。
使用场景:一般的Java 对象创建。
(2)软引用:
特点:内存不足,可以直接被挤掉。
使用场景:一般可以用作缓存。
(3)弱引用(Threadlocal 相关)
特点:只要有垃圾回收,直接去掉。
使用场景:Thread
(4)虚引用
特点:回收给一个通知
使用场景:管理直接内存,get不到,JVM垃圾回收 (只是给出信号)
2、 Threadlocal 理解
(1)概念
ThreadLocal是JDK包提供的,它提供了线程本地变量,也就是如果你创建了一个ThreadLocal变量,那么访问这个变量的每个线程都会有这个变量的一个本地副本。当多个线程操作这个变量时,实际操作的是自己本地内存里面的变量,从而避免了线程安全问题
(2)图解
3、 Threadlocal 内存泄露
注意:其中有一个map 是属于线程的,不是属于threadlocal 的
(1)上面的虚线(弱引用)可以防止内存溢出
(2) Key 为空,value 指向的内存,可能会导致内存溢出 (虽然有回收代码,但是如果代码没执行)
(3) 线程池中,多次引用也会出问题。
4、 Threadlocal 源码
5、 InheritableThreadLocal