每天一个面试题:ThreadLocal底层原理和实现Demo

news2024/9/21 7:54:53

ThreadLocal底层原理和实现Demo

  • 每天一个面试题:ThreadLocal
  • 实现ThreadLocal的Demo
  • ThreadLocal底层原理
  • 为什么ThreadLocalMap的key设计为弱引用

今天开始一个新专栏:每天一个面试题系列
也没有拿到令人心动的offer,看来自己学习方式和能力还是差很多,痛定思痛,改变自己的学习方式,辞去原有的后端实习,
开始全新的学习,沉淀才会有产出,一步一脚印!
面试题系列搞起来,这个专栏并非单纯的八股文,我会在技术底层的基础上,不至于Debug,还会做一些实例的实现,实现一些简单的Demo,或者用于我做过的项目中去;
代码会同步在我的gitee中去,觉得不错的同学记得一键三连求关注,感谢:
链接: ThreadLocal

每天一个面试题:ThreadLocal

在这里插入图片描述

  1. ThreadLocal表示线程的“局部变量”,它确保每个线程的ThreadLocal变量都是各自独立的;

  2. ThreadLocal适合在一个线程的处理流程中保持上下文(避免了同一参数在所有方法中传递);

  3. 使用ThreadLocal要用try … finally结构,并在finally中清除。

实现ThreadLocal的Demo

多个线程,我们希望每个线程内只连接到自己的数据库

public class DemoThreadLocal {


    public static void main(String[] args) {
        test();
    }

    private static void test() {


        for (int i = 0; i < 5; i++) {
            new Thread(()->{
//多个线程,我们希望每个线程内只连接到自己的数据库,这里的打印相当 各个用户 操作自己的数据库
                System.out.println(Utils.getConnection().toString());
                System.out.println(Utils.getConnection().toString());
                System.out.println(Utils.getConnection().toString());
            }, "i" + (i+1)).start();
        }
    }

    static class Utils{
	
        private static final  ThreadLocal<Connection> threadLocal = new ThreadLocal<Connection>();
		
		// 通过本地线程管理各自的数据库连接
        public static Connection getConnection(){
            Connection con = threadLocal.get();
            if (con==null) {
                con = getIn();
                threadLocal.set(con);
            }
            return con;
        }

		//配置数据库连接
        public static Connection getIn(){

            try {
                return DriverManager.getConnection("jdbc:mysql://localhost:3300/blog?useSSL=false","root","root");

            }catch (Exception e){
                throw new RuntimeException(e);
            }
        }
    }


}

在这里插入图片描述

ThreadLocal底层原理

在这里插入图片描述

在这里插入图片描述

通过hash计算去计算资源对应的位置索引,进行存放

在这里插入图片描述

如果出现了Hash冲突:拉链法、其他算法

在这里插入图片描述

为什么ThreadLocalMap的key设计为弱引用

在这里插入图片描述
在这里插入图片描述

强引用无法被GC,所以使用ThreadLocal要用try … finally结构,并在finally中清除。

在这里插入图片描述

ThreadMap在get时,如果没有值,也会执行set (key,null)操作

在这里插入图片描述

三大情况

  • 发现key= null时

在这里插入图片描述

  • GC自动收回在这里插入图片描述
  • 手动remove

在这里插入图片描述

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

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

相关文章

fastapi_No.25_获取配置项

文章目录方式1&#xff1a;隐藏在环境变量中配置环境变量Windows中配置环境变量Linux中配置环境变量在代码中获取环境变量方式2&#xff1a;隐藏在配置文件中装包在代码中获取配置文件内容在之前的代码中&#xff0c;像数据库连接信息等敏感信息&#xff0c;都直接写在代码中&a…

每日一题 —— 882. 细分图中的可到达节点

882. 细分图中的可到达节点 给你一个无向图&#xff08;原始图&#xff09;&#xff0c;图中有 n 个节点&#xff0c;编号从 0 到 n - 1 。你决定将图中的每条边 细分 为一条节点链&#xff0c;每条边之间的新节点数各不相同。 图用由边组成的二维数组 edgesedgesedges 表示&…

182:vue+openlayers 使用d3实现地图区块呈现不同颜色的效果

第182个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+openlayers中加载解析geojson文件,同时利用d3的颜色功能,使得美国每个州呈现出不同的颜色区块,方便识别。 直接复制下面的 vue+openlayers源代码,操作2分钟即可运行实现效果; 注意如果OpenStreetMap无法加载,…

UNIX环境高级编程_文件IO_文件描述符

这篇文章记录文件描述符&#xff0c;下一篇文章记录文件描述表。 1 文件描述符 先说说什么是文件IO。文件的IO就是文件的输入输出&#xff0c;也就是文件的读写。读和写是以CPU为参考的&#xff0c;从CPU向文件中写入数据&#xff0c;就是写操作&#xff1b;从文件中读取数据…

Aviation turbofan starting model

Aviation turbofan starting model 涡扇发动机(Turbofan)即涡轮风扇发动机,来源于涡轮喷气发动机,主要是为了解决涡轮喷气发动机耗油率过高的问题。其结构特点是流过风扇的空气一部分进入压气机(内涵道),一部分进入由压气机外部通道(外涵道)流过,这部分气流不经过燃烧…

01 - Linux系统概要(再论计算机系统)

---- 整理自狄泰软件唐佐林老师课程 1. 再论计算机系统 计算机系统由躯体和灵魂两部分组成 – 躯体&#xff1a;构成计算机系统的电子设备&#xff08;硬件&#xff09; – 灵魂&#xff1a;指挥躯体完成动作的指令序列&#xff08;软件&#xff09; 躯体核心&#xff1a;中央…

2022-12-05 优化el-tree懒加载选人树

今后就都拼抵抗力了嗷 需求描述 此处有一棵懒加载树&#xff08;可选人&#xff09;&#xff0c;右侧展示已选中的人。且父子关联&#xff0c;可以通过选中一个部门勾选所有子节点。问题是&#xff0c;选中父节点&#xff0c;当子节点未加载时&#xff0c;是获取不到勾选的子…

Redis配置、持久化以及相命令

Redis 什么是Redis Redis&#xff08;远程字典服务器&#xff09;是一个开源的、使用C语言编写的NoSQL数据库 Redis 基于内存运行并支持持久化&#xff0c;采用key-value&#xff08;键值对&#xff09;的存储形式&#xff0c;是目前分布式架构中不可或缺的一环。 Redis服务…

新来的性能测试工程师工资25K,看了他做的性能测试,那才真叫牛

一直深耕于互联网行业的测试工作&#xff0c;前期测试主要以项目为主&#xff0c;也就是 一个人负责2-3个项目 的测试工作&#xff0c;当然包括项目上功能、自动化和性能等一切测试工作。 我有几个朋友也在互联网大厂工作&#xff0c;从他们当中了解到其实真正的互联网大厂&…

【前端CSS】网站都变成灰色了,它是怎么实现的?(含源代码解析)

目录&#xff1a;网站都变成灰色了&#xff0c;它是怎么实现的&#xff1f;一、前言二、如何实现的三、代码的理解3.1 CSS3 filter(滤镜) 属性3.2 定义和使用3.2.1 CSS动画演示3.2.2 JS语法演示3.3 浏览器支持3.4 CSS 语法3.5 Filter 函数四、实例展示4.1 模糊实例4.2 Brightne…

3、JSP——Servlet、IDEA创建Web项目、IDEA创建JSP页面

目录 一、Servlet的概念 二、Servlet的作用 三、IDEA中创建Web项目 四、手动部署 五、自动部署 1、IDEA部署Tomcat服务器 2、IDEA部署JavaWeb项目 3、JSP页面 一、Servlet的概念 &#xff08;1&#xff09;Servlet&#xff1a;Server Applet的简称&#xff0c;是运…

云服务器配置Code-Server环境并运行Python和C++

目录1、前言2、部署流程2.1 前置准备2.2 运行docker安装Code-Server3、运行Code-Server3.1 配置运行环境3.2 运行Python3.3 运行C1、前言 云服务器需要配置C开发环境&#xff0c;了解到有code-server这个VsCode提供的云端服务&#xff0c;因此选择在云服务器上部署。 2、部署流…

D3--FPGA IIC接口通信2022-12-05

1.IIC简介 1.1 IIC概述 IIC即 Inter-Integrated Circuit(集成电路总线&#xff09;&#xff0c;是由 Philips 半导体公司在八十年代初设计出来的一种简单、双向、二线制总线标准。多用于主机和从机在数据量不大且传输距离短的场合下的主从通信。主机启动总线&#xff0c;并产…

[附源码]计算机毕业设计少儿节目智能推荐系统Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

Android 基础知识4-2.2常用控件提示(Toast)

效果图&#xff1a; 介绍&#xff1a; Toast是Android提供的“快显讯息”类&#xff0c;Toast类的使用非常简单&#xff0c;而且用途很多。比如&#xff0c;当退出应用程序时&#xff0c;可以用它来提示用户“需要更新”&#xff0c;或者当在输入框中输入文本时&#xff0c;可以…

含有双硫键的交联剂NHS-PEG1-SS-PEG1-NHS,NHS-SS-NHS,活性酯-双硫键-活性酯

基础产品数据&#xff08;Basic Product Data&#xff09;&#xff1a; 中文名&#xff1a;活性酯-双硫键-活性酯 英文名&#xff1a;NHS-SS-NHS&#xff0c;NHS-PEG1-SS-PEG1-NHS 结构式&#xff08;Structural&#xff09;&#xff1a; 详细产品数据&#xff08;Detailed Pro…

批量查询谷歌PR权重的方法有哪些?是什么影响着谷歌PR值?

批量查询谷歌PR权重的方法有哪些&#xff1f; 查询谷歌PR权重最简单最最直接的方法就是使用站长工具查询&#xff0c;具体操作如下&#xff1a; 首先打开站长工具&#xff0c;在域名输入框输入网站的域名&#xff08;一行一个&#xff09;&#xff1b; 然后勾选需要查询的功能&…

NumPy模块使用介绍

NumPy使用介绍1.NumPy科学计算库介绍和环境准备 ​ NumPy&#xff08;Numerical Python&#xff09;是Python的⼀种开源的数值计算扩展。提供多维数组对象&#xff0c;各种派⽣对象&#xff08;如掩码数组和矩阵&#xff09;&#xff0c;这种⼯具可⽤来存储和处理⼤型矩阵&…

Qt下多线程的四种使用方法总结及代码示例

文章目录前言一、继承QThread&#xff0c;重写run()函数二、继承QObject&#xff0c;使用moveToThread()函数三、继承QRunnable&#xff0c;重写run()函数&#xff0c;使用QThreadPool线程池四、使用QtConcurrent的run()函数五、示例代码六、下载链接总结前言 在之前的Qt开发工…

时间序列分析的基本流程(R语言版——实验篇)

数据处理 1.导入数据&#xff08;.csv&#xff09; 能导入绝大所数形式的格式文件 ex52<-read.table("C:\\Users\\33035\\Desktop\\习题5.2数据.txt",headerT,fileEncoding GBK) #header &#xff1a;T:表示留第一行 #fileEncoding:有中文时最好改为GBK 2.对数…