• 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();
            }
            
        }
    
  • 相关阅读:
    oracle 开发 第16章 SQL优化
    oracle 开发 第13章 数据库对象
    oracle 开发 第14章 集合
    oracle 开发 第15章 大对象
    IDEA创建springboot项目失败问题解决
    redis事务 学习笔记
    redis通信协议 学习笔记
    运行报caused by: redis.clients.jedis.exceptions.JedisConnectionException: Failed connecting to host错
    redis主从同步(复制+哨兵) 学习笔记
    redis限流redis-cell模块安装 笔记
  • 原文地址:https://www.cnblogs.com/henuzyy/p/11128822.html
Copyright © 2020-2023  润新知