ThreadLocal两大场景
1.针对于工具类,给每个线程一个工具类,从2个线程到10个线程使用线程池到静态资源到加锁到引申出ThreadLocal解决线程安全及性能问题——实现initialValue()方法,不需要实现set()适用对象初始化可自由控制场景
2.针对需要在线程多个方法之间传递的参数,我们使用ThreadLocal来保存,解决参数一直传递问题——实现set,适用对象初始化不受控制场景
使用ThreadLocal好处
1.线程安全
2.不需要加锁,效率高
3.减少创建,节省内存
4. 减少传参麻烦
主要方法
- initialValue() ------作用是设置初始值,但是延迟加载,get时才会加载,如果使用了set,则不会再initalValue(),指挥调用一次,除非remove了
- get 获取
- set设置
- remove移除当前threadLocal
结构
Thread中含有ThreadLocalMap,其中有多个ThreadLocal
注意点
- 内存泄漏,是因为value‘使用了强引用,当线程迟迟不关闭时,就容易导致OOM
- 空指针异常,常出现在装箱拆箱过程中
- 共享对象
- 如果可以不适用ThreadLocal则不需要强行使用
- 优先使用框架的支持,而不是自己创造