- 线程内数据共享,线程隔离
- 内部类
- ThreadLocalMap<ThreadLocal, Object>
- 存在每个线程里。场景如声明式事务拿conn
- key是弱引用指向ThreadLocal, value是强引用
-
Entry extends WeakReference<ThreadLocal<?>> {
Object value;
Entry(ThreadLocal<?> k, Object v) {
super(k);
value = v;
}
}
- 方法
- set(T t)
- get()
withInitial(() -> new SimpleDateFormat())
- 内存泄露问题
- ThreadLocal tl = new ThreadLocal();
- tl.set(new M());
- tl = null;
- threadLocalMap中key弱引用回收, value不回收
- tl.remove();
- 必需remove()否则内存泄露, threadLocalMap中value强引用,tl回收了也一直存在
- InheritableThreadLocal
- 继承ThreadLocal, 子线程可使用父线程变量