Java多线程(七)

111 阅读1分钟

十、Threadlocal

1、 基础知识

(1)强引用:

特点:非常强硬,挤不出去。要么被回收,要么内存溢出。

使用场景:一般的Java 对象创建。

(2)软引用:

特点:内存不足,可以直接被挤掉。

使用场景:一般可以用作缓存。

(3)弱引用(Threadlocal 相关)

特点:只要有垃圾回收,直接去掉。

使用场景:Thread

(4)虚引用

特点:回收给一个通知

使用场景:管理直接内存,get不到,JVM垃圾回收 (只是给出信号)

2、 Threadlocal 理解

(1)概念

ThreadLocal是JDK包提供的,它提供了线程本地变量,也就是如果你创建了一个ThreadLocal变量,那么访问这个变量的每个线程都会有这个变量的一个本地副本。当多个线程操作这个变量时,实际操作的是自己本地内存里面的变量,从而避免了线程安全问题

(2)图解

图片1.png

3、 Threadlocal 内存泄露

注意:其中有一个map 是属于线程的,不是属于threadlocal 的

(1)上面的虚线(弱引用)可以防止内存溢出

(2) Key 为空,value 指向的内存,可能会导致内存溢出 (虽然有回收代码,但是如果代码没执行)

(3) 线程池中,多次引用也会出问题。

4、 Threadlocal 源码

图片2.png

图片3.png

图片4.png

图片5.png

图片6.png

图片7.png

5、 InheritableThreadLocal

图片8.png