package com.example.test.threadLocal.three;
import java.util.stream.IntStream;
public class ThreeTest {
public static void main(String[] args) {
test1();
}
private static void test1() {
TemplateModel model =new TemplateModel();
//引用关系 Thread-> ThreadLocalMap-> Entry-> Object(强引用)\ThreadLocal(弱引用)
//引用关系2 主(调用Thread的线程)model->Object, 当主线程不在使用mode时model->Object关系断裂,此时如果Thread和Object的关系还在那么Object不能被回收
//remove 是将ThreadLocalMap数组下标Entry删除,删除了Entry-> Object(强引用)\ThreadLocal(弱引用)的引用
//
new Thread(() -> {
//如果local写在循环外面,a还是会被回收的why:
// ThreadLocalMap数组下标不变,value换成新的了,原引用消失,所以上一次的a就可以被回收
//ThreadLocal local = new ThreadLocal<>();
IntStream.range(0, 100).forEach((i) -> {
//一个线程里面可以new 多个ThreadLocal,会放在ThreadLocalMap数组里面
//只要此线程不关闭,Entry的key就不会为空,那么value的值就一直在
//ThreadLocalMap 数组的长度会越来越长。
//ThreadLocalMap数组下标确定使用的是线性探测(步长加1或减1),key是ThreadLocal
ThreadLocal local =new ThreadLocal<>();
int[] a =new int[1024 *1024];
local.set(a);
model.setThreadLocal(local);
model.doSomeThin();
//不写就会出现内存溢出
//会移除掉ThreadLocalMap 数组的Entry,然后value(a)才算是没有被引用了
local.remove();
});
}).start();
}
}
引用来自:https://blog.csdn.net/java_yes/article/details/95993713
网友评论