首页 > 编程语言 >手撕ThreadLocal源码

手撕ThreadLocal源码

时间:2023-05-20 11:33:02浏览次数:42  
标签:Thread Connection connection ThreadLocal 源码 new com public

1. 图解  72

手撕ThreadLocal源码_System


2. 代码  72

代码在com.powernode.threadlocal

Test

package com.powernode.threadlocal;

//这里是主main方法  72

public class Test {
    public static void main(String[] args) {
        //获取Thread对象
        Thread thread = Thread.currentThread();
        System.out.println(thread);
        

        //调用service
        UserService userService = new UserService();
        userService.save();
    }
}

UserService

package com.powernode.threadlocal;

//一个service类  72
public class UserService {
    private UserDao userDao = new UserDao();
    //提供一个方法
    public void save(){
        //获取Thread对象
        Thread thread = Thread.currentThread();
        System.out.println(thread);

        //得到connection
        Connection connection = DBUtil.getConnection();
        System.out.println(connection);

        //调用UserDao中的insert方法
        userDao.insert();
    }
}

UserDao

package com.powernode.threadlocal;

//一个Dao类  72
public class UserDao {
    public void insert(){
        //获取Thread对象
        Thread thread = Thread.currentThread();
        System.out.println(thread);

        //得到connection
        Connection connection = DBUtil.getConnection();
        System.out.println(connection);

        System.out.println("User Dao insert");
    }
}

MyThreadLocal

package com.powernode.threadlocal;

import java.util.HashMap;
import java.util.Map;

//这个类负责使用map集合存储connection对象  72
public class MyThreadLocal {
    //所有需要和当前线程绑定的数据要放到这个容器中
    private Map map = new HashMap<>();

    //向ThreadLocal中绑定数据
    public void set(T obj){
        map.put(Thread.currentThread(),obj);
    }

    //从ThreadLocal中获取数据
    public T get(){
        return map.get(Thread.currentThread());
    }

    //移除ThreadLocal当中的数据
    public void remove(){
        map.remove(Thread.currentThread());
    }


}

Connection

package com.powernode.threadlocal;

//connection类  72
public class Connection {
}

DBUtil

package com.powernode.threadlocal;

//工具类  72
public class DBUtil {
    //静态变量特点,类加载时执行,并且只执行一次
    //全局大Map集合
    private  static MyThreadLocal local = new MyThreadLocal<>();

    //每次都调用这个方法来获取Connection对象
    public static Connection getConnection(){
        Connection connection = local.get();
        if(connection==null){
            //第一次调用getConnection方法的时候,connectin一定是空的
            //空的就new一次
            connection = new Connection();
            //将new的connection对象绑定到Map集合中
            local.set(connection);
        }
        return connection;
    }
}

手撕ThreadLocal源码_java_02

标签:Thread,Connection,connection,ThreadLocal,源码,new,com,public
From: https://blog.51cto.com/u_15784725/6317337

相关文章

  • 直播源码技术控制直播稳定之消息篇
    在日常生活中,我们上网看直播在各个直播间内通常能看到各种各样的消息,像是用户为主播打赏礼物,直播间聊天区,又或是用户点赞出现的符号信息等,这些消息在让直播间变得多姿多彩同时,也为直播平台运营商面临了一个问题:当消息类型同时发出且数量庞大时,直播间就很可能崩溃,那我们如何解决这个......
  • iEnhancer-ENCC_test_layer1.py源码阅读
    一、基本准备¶1、导入包:与train一致¶ In [ ]:importnumpyasnpimporttorchfromtorchimportnnfromtorch.autogradimportVariablefromtorch.utils.dataimportDataset,DataLoaderimporttorch.nn.functionalasFimportpickleimport......
  • java基于springboot+vue的漫画网站管理系统,附源码+数据库+lw文档+PPT,适合毕业设计、课
    1、项目介绍考虑到实际生活中在漫画网站方面的需要以及对该系统认真的分析,将系统权限按管理员和用户这两类涉及用户划分。(a)管理员;管理员使用本系统涉到的功能主要有:首页、个人中心、用户管理、漫画分类管理、漫画投稿管理、分类管理、排行榜管理、交流论坛、系统管理等功能......
  • 模块与包,反序列化源码解析,drf请求响应,视图组件两个视图基类
    0模块与包的使用#模块与包 -模块:一个py文件,被别的py文件导入使用,这个py文件称之为模块,运行的这个py文件称之为脚本文件-包:一个文件夹下有__init__.py#模块与包的导入问题 '''0导入模块有相对导入和绝对导入,绝对的路径是从环境变量开始的1......
  • .NET 通过源码深究依赖注入原理
    依赖注入(DI)是.NET中一个非常重要的软件设计模式,它可以帮助我们更好地管理和组织组件,提高代码的可读性,扩展性和可测试性。在日常工作中,我们一定遇见过这些问题或者疑惑。Singleton服务为什么不能依赖Scoped服务?多个构造函数的选择机制?源码是如何识别循环依赖的?虽然我们可......
  • drf之反序列化校验源码分析 、 断言 、drf之请求和响应
    目录一、反序列化校验源码分析入口:总结:二、断言三、drf之请求3.1Request类对象的分析.data.query_params其他的属性用起来跟之前一样3.2请求,能够接受的编码格式限制只能接受某种或某几种编码格式限制方式一:在视图类上写---》只是局部视图类有效限制方式二:在配置文件中写---》全......
  • DCC32命令行方式编译delphi工程源码
    本文链接地址:http://blog.csdn.net/sushengmiyan/article/details/10284879作者:苏生米沿 一、首先找到这个可执行文件,熟悉delphi的人应该很容易就找到,打开你安装delphi的目录,如我的路径C:\ProgramFiles\Delphi_2007\bin\DCC32.EXE二、拷贝一份出来,我将其放在了我的测试目录下......
  • 2023最新OneTool多平台助手程序源码
    2023最新OneTool多平台助手程序源码开心可用版本:https://download.csdn.net/download/mo3408/87799108OneTool 是一款功能强大的多平台助手,目前最新版本为199911(1.9.1)。除此之外,该应用程序还拥有其他好玩的功能,等着您们来搭建测试。可以帮助用户快速完成各种任务。例如网......
  • APP中RN页面热更新流程-ReactNative源码分析
    平时使用WebStorm或VSCode对RN工程中的文件修改后,在键盘上按一下快捷cmd+s进行文件保存,此时当前调试的RN页面就会自动进行刷新,这是RN开发相比于原生开发一个很大的优点:热更新。那么,从按一下快捷cmd+s到RN页面展示出最新的JS页面,这个过程是怎样发生的呢?下面根据时间顺序来梳理一下......
  • Sentinel基本使用与源码分析
    系列文章目录和关于我一丶什么是SentinelSentinel官网Sentinel是面向分布式、多语言异构化服务架构的流量治理组件,主要以流量为切入点,从流量路由、流量控制、流量整形、熔断降级、系统自适应过载保护、热点流量防护等多个维度来帮助开发者保障微服务的稳定性。流量整形:限制流......