当前位置: 首页 > news >正文

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

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

在这里插入图片描述

相关文章:

  • 【C语言航路】第七站:结构体初阶
  • Spring Cloud(十四):微服务灰度发布 --- Discovery
  • 你居然还去服务器上捞日志,搭个日志收集系统难道不香吗?
  • 计算机毕业设计Java家教到家平台(源码+系统+mysql数据库+lw文档)
  • 华为云低代码技术:让矿区管理“智变”,一览无遗
  • 简单宠物网页设计作业 静态HTML动物介绍网页作业 DW宠物网站模板下载 大学生简单野生动物网页作品代码
  • 车间调度|基于帝王蝶优化算法的车间调度(Matlab代码实现)
  • 【蓝桥杯】第十四届模拟赛第一期及第二期填空汇总
  • 03、自定义镜像上传阿里云
  • 并发基本原理(四):AQS源码解析1-ReentrantLock的lock实现原理
  • C语言刷题(2)
  • 电子印章结构以及规范讲解
  • Mysql面试题汇总
  • 抗疫众志成城网页设计成品 抗击疫情感动人物网页制作模板 大学生抗疫静态HTML网页源码 dreamweaver网页作业致敬逆行者网页设计作品
  • Python基础-8-函数
  • linux 中 mq_notify 创建线程监控消息队列实现原理
  • 计算机毕业设计Java家用饰品在线销售系统(源码+系统+mysql数据库+lw文档)
  • 06_openstack之创建云主机和常见错误
  • @EventPublisher + @Async 异步事件流详解
  • 4.JVM垃圾收集机制
  • 两部门预拨4000万元支持山西、广西、陕西做好抗旱救灾工作
  • 中央网信办:重点整治违规AI产品、利用AI制作发布谣言等突出问题
  • 中央党校(国家行政学院)举行2025年春季学期第一批进修班毕业典礼
  • 书业观察|一本书的颜值革命:从毛边皮面到爆火的刷边书
  • 澎湃回声|山东莱州、潍坊对“三无”拖拉机产销市场展开调查排查
  • 湖南华容县通报“大垱湖水质受污染”,爆料者:现场已在灌清水