ThreadLocal知识梳理

ThreadLocal知识梳理

ThreadLocal方法:
1.get():获取当前线程绑定的变量
2.set():将变量绑定到当前线程中
3.remove():判断该当前线程对应的threadLocals变量是否为null,不为null就移除当前线程中变量的副本

ThreadLocal VS synchronized的区别:
ThreadLocal :多线程中让每个线程数据隔离,采取以空间换时间的方式,为每个线程都提供了一份变量的副本,从而实现同时访问互不干扰。可以使程序拥有更高的并发性
synchronized:多线程之间访问资源同步,采取以时间换空间的方式,只提供一份变量让不同的线程排队访问

ThreadLocal 的优点:
1.传递数据:保存每个线程绑定的数据,在需要的地方直接获取,避免参数直接传递带来的代码耦合的问题
2.数据隔离:各线程相互隔离却又具备并发性,避免同步方式带来的性能损失

线程隔离:在多线程并发的场景下,每个线程中的变量是相互独立的
线程A :设置变量1 获取变量1
线程B :设置变量2 获取变量2

ThreadLocal 实现原理:
Thread维护ThreadLocalMap存储数据的容器
ThreadLocalMap由一个个Entry对象组成,Entry对象的键:ThreadLocal对象 值:当前线程所对应的值

内存泄漏
Memory overflow:内存溢出,没有足够的内存提供申请者使用
Memory leak:内存泄漏,程序中已动态分配堆内存由于某种原因程序未释放,导致程序运行速度减慢甚至系统崩溃等严重后果,内存泄漏的堆积将导致内存溢出

弱引用 VS 强引用
弱引用:垃圾回收器一旦发现只有弱引用的对象,不管内存空间足够与否,都会回收它的内存。
强引用:普通对象引用,只要还有强引用指向一个对象,即认为对象还活着,垃圾回收器不会回收这种对象
为啥ThreadLocal使用的是弱引用:弱引用的ThreadLocal会被回收,对应的value在下一次调用set,get,remove方法时会被清除,从而避免内存泄漏(在ThreadLocalMap中的set/getEntry方法中会为key为null的value置为null)
在这里插入图片描述

ThreadLocal内存泄漏的根源:由于ThreadLocalMap与Thread一样长,如果没有手动删除对应的key,就会导致内存泄漏。
避免内存泄漏:使用完ThreadLocal调用remove()方法删除对应的Entry

多线程并发访问导致数据不一致问题
1.可以采用synchronized加锁的方式
2.可以使用ThreadLocal的方式
在这里插入图片描述

采用synchronized加锁的方式
在这里插入图片描述

使用ThreadLocal的方式
在这里插入图片描述

ThreadLocal 在登录校验用户中的使用
1.写ThreadLcoal 存,取,移除用户的方法

在这里插入图片描述

2.在登录拦截中添加用户到ThreadLocal 中

在这里插入图片描述

3.使用时直接取ThreadLocal 的用户信息

在这里插入图片描述

参考视频:ThreadLocal

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值