• 手撕ThreadLocal源码


    首先,创建MyThreadLocal类,区分开java.lang.ThreadLocal

    1. package com.huhu.threadlocal;
    2. import java.util.HashMap;
    3. import java.util.Map;
    4. public class MyThreadLocal {
    5. /**
    6. * 所有需要和当前线程绑定的数据要放到这个容器当中
    7. */
    8. private Map map = new HashMap<>();
    9. /**
    10. * 向ThreadLocal中绑定数据
    11. */
    12. public void set(T obj) {
    13. map.put(Thread.currentThread(), obj);
    14. }
    15. /**
    16. * 从ThreadLocal中获取数据
    17. *
    18. * @return
    19. */
    20. public T get() {
    21. return map.get(Thread.currentThread());
    22. }
    23. /**
    24. * 移除ThreadLocal当中的数据
    25. */
    26. public void remove() {
    27. map.remove(Thread.currentThread());
    28. }
    29. }

     接着,分别创建Connection类和DBUtil

    1. package com.huhu.threadlocal;
    2. public class Connection {
    3. }
    1. package com.huhu.threadlocal;
    2. public class DBUtil {
    3. //静态变量特点:类加载时执行,并且只执行一次
    4. private static MyThreadLocal local=new MyThreadLocal<>();
    5. /**
    6. * 调用方法获取Connection对象
    7. * @return
    8. */
    9. public static Connection getConnection(){
    10. Connection connection=local.get();
    11. if (connection==null){
    12. //第一次调用方法肯定为null,new一个
    13. connection=new Connection();
    14. //将new出来的Connection对象绑定到Map集合中
    15. local.set(connection);
    16. }
    17. return connection;
    18. }
    19. }

    然后创建UserDao类和UserService类

    1. package com.huhu.threadlocal;
    2. public class UserDao {
    3. public void insert() {
    4. Thread thread=Thread.currentThread();
    5. System.out.println(thread);
    6. Connection connection = DBUtil.getConnection();
    7. System.out.println(connection);
    8. System.out.println("User Dao insert...");
    9. }
    10. }
    1. package com.huhu.threadlocal;
    2. public class UserService {
    3. private UserDao userDao = new UserDao();
    4. public void save() {
    5. Thread thread=Thread.currentThread();
    6. System.out.println(thread);
    7. Connection connection = DBUtil.getConnection();
    8. System.out.println(connection);
    9. userDao.insert();
    10. }
    11. }

    最后,创建测试Test类

    1. package com.huhu.threadlocal;
    2. //张三发送请求,对应一个线程t1
    3. //李四发送请求,对应一个线程t2
    4. public class Test {
    5. public static void main(String[] args) {
    6. Thread thread=Thread.currentThread();
    7. System.out.println(thread);
    8. //Connection connection=new Connection();
    9. UserService userService=new UserService();
    10. userService.save();
    11. }
    12. }

  • 相关阅读:
    【机器学习-周志华】学习笔记-第十五章
    this的四个绑定规则
    oracle存储过程实现定时备份表和处理重复数据
    软件项目管理 8.1.软件质量基本概念
    Python keyword-only参数
    AI :微软推出 AutoGen 框架,帮开发者创建基于大语言模型的复杂应用
    ubuntu22.04下面安装josm
    Linux配置密钥登录、更换SSH端口Windows更改远程桌面端口
    Linux的命令行
    动态规划 DP专题
  • 原文地址:https://blog.csdn.net/bubbleJessica/article/details/128193224