🧑💻作者名称:DaenCode
🎤作者简介:CSDN实力新星,后端开发两年经验,曾担任甲方技术代表,业余独自创办智源恩创网络科技工作室。会点点Java相关技术栈、帆软报表、低代码平台快速开发。技术尚浅,闭关学习中······
😎人生感悟:尝尽人生百味,方知世间冷暖。
📖所属专栏:Java基础夯实
专栏推荐
- 专门为Redis入门打造的专栏,包含Redis基础知识、基础命令、五大数据类型实战场景、key删除策略、内存淘汰机制、持久化机制、哨兵模式、主从复制、分布式锁等等内容。
链接>>>>>>>>>
《Redis从头学》 - 专门为RabbitMQ入门打造的专栏,持续更新中。。。。。。。。
链接>>>>>>>
《图解RabbitMQ》
文章目录
- 专栏推荐
- 🌟介绍
- 🌟主要方法
- 🌟为什么采用弱引用?
- 🌟它与Synchronized有啥区别?
- 🌟应用场景
- 🌟写在最后
🌟介绍
以下解释来源于百度百科:
ThreadLocal是Thread的局部变量,用于编多线程程序,对解决多线程程序的并发问题有一定的启示作用。
以下解释来源于ChatGpt:
ThreadLocal 是 Java 中的一个线程局部变量,它提供了一种在多线程环境下将数据与线程关联的机制。每个线程都有
自己独立的 ThreadLocal 实例
,可以存储和获取线程的局部变量
,而不会被其他线程访问或干扰
。使用 ThreadLocal
可以实现线程封闭(Thread confinement)的效果,将数据与线程隔离开来,保证线程安全性
。每个线程都可以独立地修改和获取 ThreadLocal 中存储的数据,而不会影响其他线程。
个人理解:
- 线程的局部变量。
- 线程间隔离,每个线程有自己独立的变量空间。
- 同一个线程共享数据。
🌟主要方法
- set(T value):设置当前线程的 ThreadLocal 变量值。
- get():获取当前线程的 ThreadLocal 变量值。
- remove():移除当前线程的 ThreadLocal 变量值。
🌟为什么采用弱引用?
解决这个问题之前先来看一下,强引用、软引用、弱引用是啥玩意儿?
- 强引用:new一个对象是强引用
- 软引用:有用但不必须得对象。当内存空间充足,垃圾回收器不会进行回收;当JVM内存空间不足时,会去清理软引用对象。适合用来实现缓存。
- 弱引用:只是偶尔使用,在用的时候可以随时获取,但也不影响垃圾的收集。声明周期比软引用还短,不管内存空间足不足都会回收这个对象。
原因
- 如果使用强引用,即使把key设置为null。没有手动删除,也不会进行垃圾回收,会导致内存泄露。
- 如果使用弱引用,即使没有手动删除,内存泄漏时。它也会被回收。
🌟它与Synchronized有啥区别?
- 都是为了解决多线程中相同变量的访问冲突问题。
- Synchronized通过线程等待解决问题,牺牲了时间。
- ThreadLocal通过为每个线程分配独立的存储空间,牺牲了空间。
- 对比Synchronized,ThreadLocal具有线程隔离效果,同个线程共享变量。
🌟应用场景
web系统登录时,用于传递登录的用户信息。具体举例见以下代码:
public class LoginInterceptor implements HandlerInterceptor {
//线程局部共享变量
public static ThreadLocal<LoginUser> threadLocal=new ThreadLocal<>();
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//获取token
//解密token
//claims为空
//登录失败。
//不为空
//登录,根据clainms
//传递登录用户
// request.setAttribute("loginUser",loginUser);
threadLocal.set(loginUser);
return true;
}
//。。。。。登录失败
return false;
}
🌟写在最后
有关于我消化后的ThreadLocal是怎样的?到此就结束了。感谢大家的阅读,希望大家在评论区对此部分内容散发讨论,便于学到更多的知识。