ThreadLocal

2020-05-26  本文已影响0人  呆呆猿

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

上一篇 下一篇

猜你喜欢

热点阅读