【多线程】ThreadLocal
文章目录
两种典型应用场景
场景1独享对象
代码迭代git
但通过加锁解决共享对象
性能问题:还存在sycnized同一时间只能处理一个的,排队问题
ThreadLocal:解决加锁性能问题
改写dataformat来源
代码迭代2->5
生产出线程安全(时间不会重复)的日期(不用new 1000个对象,不用因为加锁 排队等待)
拓展
buider
什么是ConcurrentHashMap?
ConcurrentHashMap 是Java集合中map的实现,是HashMap的线程安全版本,性能也比较好。ConcurrentHashMap在数据结构上和HashMap的数据结构是一致的,区别在于ConcurrentHashMap是线程安全的,而HashMap不是线程安全的。在需要用到HashMap且是多线程的情况下,推荐使用ConcurrentHashMap。
## 场景2 解决:用户信息需要被线程内所有方法共享
ThreadLocal
定义全局存储行不行?有性能损耗userMap
不用初始化,直接set/get
更好的解决办法ThreadLocal
ThreadLocal作用
主要方法
方法
initValue 延迟加载
ThreadLocal原理及源码
remove 删除map中对应的一个 this
map 类似hashmap但是解决hash冲突的时候不同(线性探测发,找下一个空位置)
注意问题
内存泄漏
制为null,在threadlocal->resize
解决:内存泄漏(阿里规约,调用的最后remove())
针对线程进行回收
空指针异常
直接get,k默认为null。注意装箱拆箱
解决: 注意强引用 弱引用
强引用
我们平日里面的用到的new了一个对象就是强引用,例如 Object obj = new Object();当JVM的内存空间不足时,宁愿抛出OutOfMemoryError使得程序异常终止也不愿意回收具有强引用的存活着的对象。
弱引用
弱引用是通过WeakReference类实现的,在GC的时候,不管内存空间足不足都会回收这个对象,适用于内存敏感的缓存,ThreadLocal中的key就用到了弱引用,有利于内存回收。
本文地址:https://blog.csdn.net/weixin_43469680/article/details/110946700
上一篇: 批处理命令Start的使用介绍
下一篇: 批处理实现的五子棋人机对战游戏