美文网首页
ThreadLocal

ThreadLocal

作者: 呆呆猿 | 来源:发表于2020-05-26 22:35 被阅读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

    相关文章

      网友评论

          本文标题:ThreadLocal

          本文链接:https://www.haomeiwen.com/subject/clpbahtx.html