zoukankan      html  css  js  c++  java
  • ThreadLocal简介

        /**
         * 该Map是ThredLocal里面的数据结构,但是是存储在Thread 类中
         *
         * **/
        static class ThreadLocalMap {
    
            static class Entry extends WeakReference<ThreadLocal<?>> {
                /**
                 * The value associated with this ThreadLocal.
                 */
                Object value;
    
                /***
                 * key: 只有ThreadLocal 本身是强引用(static 修饰)的时候, Entry中Key 才不能为null,
                 *
                 */
                Entry(ThreadLocal<?> k, Object v) {
                    super(k);
                    value = v;
                }
            }
    
        }
    
        /**
         * ThreadLocal建议: 使用 private static final 修饰
         * <p>
         * <p>
         * 强引用的ThreadLocal , 那么每次基本上都可以根据key找到对应的SimpleDateFormat,不会出现查找不到。
         * 如果Thread 声明周期结束了,那么实例对象也会被销毁。
         **/
        private static final ThreadLocal<SimpleDateFormat> SIMPLE_DATE_FORMAT_THREAD_LOCAL = new ThreadLocal<SimpleDateFormat>() {
            @Override
            protected SimpleDateFormat initialValue() {
                return new SimpleDateFormat("yyyymmdd HH:mm:sss");
            }
        };
    
    
        public static void testThreadLocal() {
            /**
             *
             * 声明为局部的话,访问该方法的线程都会存储一份SimpleDateFormat实例,
             * ThreadLocalMap.Entry中的key 是WeakReference类型,导致出了作用域(该方法执行结束) key 就为null , value 就无法立即回收, 可能会出现内存泄露的风险,
             * 在使用完成后,调用remove方法可以解决内存泄露的风险
             * */
            ThreadLocal<SimpleDateFormat> simpleDateFormatThreadLocal = new ThreadLocal<SimpleDateFormat>() {
                @Override
                protected SimpleDateFormat initialValue() {
                    return new SimpleDateFormat("yyyymmdd HH:mm:sss");
                }
            };
    
            try {
                SimpleDateFormat sdf = simpleDateFormatThreadLocal.get();
                System.out.println(sdf.format(new Date()));
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                /**
                 *
                 * ThreadLocal 中的get() set()  remove() 方法都有可能会执行到将Entry[] <Key,Value> 中key==null的删除掉。
                 *
                 * **/
                simpleDateFormatThreadLocal.remove();
            }
            
        }
    
  • 相关阅读:
    算法竞赛入门经典训练指南
    git保护--git分支创建
    解决多个iframe嵌套而造成的多个滚动条问题
    css如何让div元素铺满整个屏幕
    第一个用python3写的爬虫小例子
    用JS获取当前页面的URL以及截取其中的字段
    css处理超出文本截断问题的两种情况(多行或者单行)
    约数的个数
    成绩排序
    八进制
  • 原文地址:https://www.cnblogs.com/henuzyy/p/11128822.html
Copyright © 2011-2022 走看看