【Java基础夯实】我消化后的ThreadLocal是怎样的?

news2024/9/27 5:56:28

🧑‍💻作者名称:DaenCode
🎤作者简介:CSDN实力新星,后端开发两年经验,曾担任甲方技术代表,业余独自创办智源恩创网络科技工作室。会点点Java相关技术栈、帆软报表、低代码平台快速开发。技术尚浅,闭关学习中······
😎人生感悟:尝尽人生百味,方知世间冷暖。
📖所属专栏:Java基础夯实


在这里插入图片描述


专栏推荐

  • 专门为Redis入门打造的专栏,包含Redis基础知识、基础命令、五大数据类型实战场景、key删除策略、内存淘汰机制、持久化机制、哨兵模式、主从复制、分布式锁等等内容。链接>>>>>>>>>《Redis从头学》
  • 专门为RabbitMQ入门打造的专栏,持续更新中。。。。。。。。链接>>>>>>>《图解RabbitMQ》

文章目录

  • 专栏推荐
  • 🌟介绍
  • 🌟主要方法
  • 🌟为什么采用弱引用?
  • 🌟它与Synchronized有啥区别?
  • 🌟应用场景
  • 🌟写在最后

🌟介绍

以下解释来源于百度百科

ThreadLocal是Thread的局部变量,用于编多线程程序,对解决多线程程序的并发问题有一定的启示作用。

以下解释来源于ChatGpt:

ThreadLocal 是 Java 中的一个线程局部变量,它提供了一种在多线程环境下将数据与线程关联的机制。每个线程都有自己独立的 ThreadLocal 实例,可以存储和获取线程的局部变量,而不会被其他线程访问或干扰

使用 ThreadLocal 可以实现线程封闭(Thread confinement)的效果,将数据与线程隔离开来,保证线程安全性。每个线程都可以独立地修改和获取 ThreadLocal 中存储的数据,而不会影响其他线程。

个人理解

  • 线程的局部变量。
  • 线程间隔离,每个线程有自己独立的变量空间。
  • 同一个线程共享数据。

🌟主要方法

在这里插入图片描述

  1. set(T value):设置当前线程的 ThreadLocal 变量值。
  2. get():获取当前线程的 ThreadLocal 变量值。
  3. remove():移除当前线程的 ThreadLocal 变量值。

🌟为什么采用弱引用?

在这里插入图片描述

解决这个问题之前先来看一下,强引用、软引用、弱引用是啥玩意儿?

  1. 强引用:new一个对象是强引用
  2. 软引用:有用但不必须得对象。当内存空间充足,垃圾回收器不会进行回收;当JVM内存空间不足时,会去清理软引用对象。适合用来实现缓存。
  3. 弱引用:只是偶尔使用,在用的时候可以随时获取,但也不影响垃圾的收集。声明周期比软引用还短,不管内存空间足不足都会回收这个对象。

原因

  1. 如果使用强引用,即使把key设置为null。没有手动删除,也不会进行垃圾回收,会导致内存泄露。
  2. 如果使用弱引用,即使没有手动删除,内存泄漏时。它也会被回收。

🌟它与Synchronized有啥区别?

  1. 都是为了解决多线程中相同变量的访问冲突问题。
  2. Synchronized通过线程等待解决问题,牺牲了时间。
  3. ThreadLocal通过为每个线程分配独立的存储空间,牺牲了空间。
  4. 对比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是怎样的?到此就结束了。感谢大家的阅读,希望大家在评论区对此部分内容散发讨论,便于学到更多的知识。


请添加图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1019014.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

面试题:jwt 是什么?java-jwt 呢?

文章目录 JWT概念JWT流程&#xff1a;JWT的构成JWT与开发语言JWT官网java-jwt产生加密Token解密Token获取负载信息并验证Token是否有效 JWT概念 JWT &#xff0c; 全写JSON Web Token, 是开放的行业标准RFC7591&#xff0c;用来实现端到端安全验证. 简单来说&#xff0c; 就是…

OpenCV Series : Target Box Outline Border

角点 P1 [0] (255, 000, 000) P2 [1] (000, 255, 000) P3 [2] (000, 000, 255) P4 [3] (000, 000, 000)垂直矩形框 rect cv2.minAreaRect(cnt)targetColor roi_colortargetThickness 1targetColor (255, 255, 255)if lineVerbose:if …

【斗破年番】紫研新形象,萧炎终成翻海印,救援月媚,三宗决战

Hello,小伙伴们&#xff0c;我是小郑继续为大家深度解析斗破年番。 斗破苍穹年番动画更新了&#xff0c;小医仙帅气回归&#xff0c;萧炎紫妍成功进入山谷闭关苦修&#xff0c;美杜莎女王守护没多久&#xff0c;就因蛇人族求救离开。从官方公布的最新预告来看&#xff0c;萧炎紫…

地图结构 | 详解八叉树Octomap原理与Rviz可视化

目录 0 专栏介绍1 点云地图的局限性2 八叉树基本原理3 Octovis可视化4 点云转化octomap5 ROS Rviz可视化 0 专栏介绍 &#x1f525;附C/Python/Matlab全套代码&#x1f525;课程设计、毕业设计、创新竞赛必备&#xff01;详细介绍全局规划(图搜索、采样法、智能算法等)&#x…

Web 器学习笔记(基础)

Filter 过滤器 概念&#xff1a;表示过滤器&#xff0c;是 JavaWeb 三大组件&#xff08;Servlet、Filter、Listener&#xff09;之一 作用&#xff1a;顾名思义可以过滤资源的请求&#xff0c;并实现特殊的需求 Filter 接口及它核心的 doFilter() 方法&#xff08;执行前就是…

JVM 第一章:Java运行时数据区

目录 一.了解JVM 1.1什么是JVM 1.2JRE/JDK/JVM 1.3JVM的整体结构 二.Java运行时数据区 2.1程序计数器(PC寄存器) 2.2Java虚拟机栈&#xff08;Java Virtual Machine Stacks&#xff09; 2.2.1栈帧的组成 2.2.2问题辨析 2.2.3逃逸分析 ①栈上分配 ②标量分析 ③同步…

深入探究Spring自动配置原理及SPI机制:实现灵活的插件化开发

文章目录 前言SpringBootApplication 注解AutoConfigurationPackage 注解AutoConfigurationImportSelector SPI 机制和 SpringFactoriesLoaderJDK 中的 SPI 机制SpringFactoriesLoader ConditionalOn 系列条件注解ConditionalOn 系列条件注解的示例ConditionalOn 系列条件注解的…

MySQL中如何识别低效的索引

我是一个目录 前言(可以跳过直接看正文)索引的基本原理索引设计的原则创建索引的原则 正文使用索引查询一定能提高查询的性能吗&#xff1f;怎样查看索引是否有高选择性&#xff1f;用一条SQL查看低效的索引 前言(可以跳过直接看正文) 索引的基本原理 索引用来快速地寻找那些…

学习分布式第一天(分布式系统原理和概念)

目录 分布式系统原理和概念 1.分布式系统&#xff1a; 单体架构&#xff1a; 垂直架构&#xff1a; 分布式架构&#xff1a; 2.分布式计算&#xff1a; 3.CAP 原理&#xff1a; 4.BASE 理论&#xff1a; 5.Paxos 算法&#xff1a; 6.Raft 算法&#xff1a; 分布式系统原…

【Transformer系列】深入浅出理解Transformer网络模型(综合篇)

一、参考资料 The Illustrated Transformer 图解Transformer&#xff08;完整版&#xff09; Attention Is All You Need: The Core Idea of the Transformer transformer 总结(超详细-初版) Transformer各层网络结构详解&#xff01;面试必备&#xff01;(附代码实现) 大语言…

zemax球差与消球差

基础设置&#xff1a; 效果&#xff1a; 光线光扇图&#xff1a; 可见存在球差&#xff08;具体分析看我的另一篇文章&#xff0c;专门介绍光线光扇图&#xff09; 弥散的像&#xff1a; 定量计算赛德尔像差系数&#xff1a; 矫正&#xff1a; 凹凸透镜补偿法、非球面校正球差…

线上论坛之单元测试

对线上论坛进行单元测试的测试报告 源码地址&#xff1a;https://gitee.com/coisini-thirty-three/forum 一、用户部分&#xff08;UserServiceImplTest&#xff09; 1.创建普通用户 测试名称 createNormalUser() 测试源码 Test void createNormalUser() { // 构造用户 User …

Linux 系统目录结构 终端

系统目录结构 Linux 或 Unix 操作系统中&#xff0c;所有文件和目录呈一个以根节点为始的倒置的树状结构。文件系统的最顶层是根目录&#xff0c;用 / 来表示根目录。在根目录之下的既可以是目录&#xff0c;也可以是文件&#xff0c;而每一个目录中又可以包含子目录文件。如此…

什么是函数式编程(functional programming)?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 函数式编程⭐ 核心概念⭐ 函数式编程示例⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 欢迎来到前端入门之旅&#xff01;感兴趣的可以订阅本专栏哦&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚踏入前…

解决WSL2占用内存过多问题(Docker on WSL2: VmmemWSL)

解决WSL2占用内存过多问题&#xff08;Docker on WSL2: VmmemWSL&#xff09; 一、问题描述二、问题解决2.1 创建.wslconfig文件2.2 重启wsl2 一、问题描述 安装完WSL2后&#xff0c;又安装了Docker&#xff0c;使用了一段时间&#xff0c;发现电脑变卡&#xff0c;进一步查看…

voliate实战:voliate可见性验证有序性非原子性验证

一、可见性验证 下面的程序验证了voliate的可见性。 public class VolatileVisibilityTest {private static volatile boolean inintFlag false;public static void main(String[] args) throws InterruptedException {new Thread(() -> {System.out.println("waiti…

Springboot-mybatis创建项目报错day01

problem01 出现springboot引入mbatis-plus依赖单元测试时出现 Error:(3, 44) java: 程序包com.baomidou.mybatisplus.core.mapper不存在。 Error querying database. Cause: org.springframework.jdbc.CannotGetJdbcConnectionException:异常。 solution 点击右边侧栏Maven的Ge…

在visual studio里安装Python并创建python工程

在2009年&#xff0c;云计算开始发力&#xff0c;Python、R、Go这些天然处理批量计算的语言也迅猛发展。微软在2010年&#xff0c;把Python当成一个语言包插件&#xff0c;集成到了visual studio 2010里。在"云优先&#xff0c;移动优先"的战略下&#xff0c;于2015年…

直方图规定化,计算 SML 映射(数字图像处理大题复习 P3)

文章目录 1. 累计直方图概率2. 累计规定直方图3. 根据累计直方图概率和累计规定直方图 计算 SML 映射4. 计算变化后直方图结果 1. 累计直方图概率 我们最终的目的是从 表 1 变成 表 2 首先我们仍要先求出累计直方图概率 2. 累计规定直方图 把规定直方图抄到下面 然后我们…

Python入门教学——self

1、简介 我们知道在创建类的实例方法时&#xff0c;需要传入一个self&#xff0c;不然就会报错。那么这个self是什么呢&#xff1f;有什么作用呢&#xff1f; def 方法名(self,args): # args为参数pass 在Python类中规定&#xff0c;函数的第一个参数是实例对象本身&#xff…