/**
* 该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();
}
}