ThreadLocal的主要用途有二:
1:给每个线程copy份独自的成员变量
2: 复用数据抽取成成员变量 ,减少new 的操作
给每个线程copy份独自的成员变量的基本用法
org.springframework.format.datetime.DateFormatter@73c30c5
org.springframework.format.datetime.DateFormatter@76724124
org.springframework.format.datetime.DateFormatter@b4f2bbf
org.springframework.format.datetime.DateFormatter@3da4d42f
org.springframework.format.datetime.DateFormatter@5c0e390d
org.springframework.format.datetime.DateFormatter@594dd94f
org.springframework.format.datetime.DateFormatter@28096f61
org.springframework.format.datetime.DateFormatter@77c69e3e
org.springframework.format.datetime.DateFormatter@344d0fd0
org.springframework.format.datetime.DateFormatter@49ae9bf
输出的结果如上 每个get()出来的每个对象都不一样
复用数据抽取成成员变量 ,减少new 的操作的基本用法
输出如上;
ThreadLocal 的基本原理
一共就对外暴露三个方法
get(),set(),remove
以下是对应的源码
set()
这里没有显示 map构造的源码
有兴趣可以看 这篇 https://www.cnblogs.com/fsmly/p/11020641.html 写的蛮详细
remove()
ThreadLocal 的溢出问题
因为ThreadLocal 使用当前线程的LocalsMap
然后 其中的entry是弱引用
可能会被GC回收(虽然GC的优先级很低) 而对应的value 确一直保存在内存中
所以有内存溢出的风险
用完remove 是个好习惯。