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();
            }
            
        }
    
  • 相关阅读:
    UML中的构件图
    Extjs4 中的gird
    【转载】C#实现线程安全的网络流
    [转载]组播
    【转载】wcf综合运用之:大文件异步断点续传
    【转载】WCF热门问题编程示例(4):WCF客户端如何异步调用WCF服务?
    【转载】特殊用途的IP地址介绍
    [转载]C# HashTable
    c宏定义实战
    c异或加密与解密
  • 原文地址:https://www.cnblogs.com/henuzyy/p/11128822.html
Copyright © 2011-2022 走看看