ThreadLocal的工作原理

场景

假设一个用户是一个线程。他们都对数据库进行操作,这个时候就会每个用户就会从数据源中开启一个事务以确保能够顺利的打开或者关闭事务。那么如何保证用户与用户之间的数据库连接不发生冲突呢?就是用ThreadLocal。

原理解释

这里先交代一下,每一个线程都有自己的一个Map集合叫做ThreadLocalMap他是线程的一个静态内部类它就是用来保存连接的集合,ThreadLocal是一个工具类它负责将一个连接放入到每一个线程的Map集合中。具体来说就是每来一个用户,数据源就会创建一个连接Connection然后ThreadLocal工具类会将这个新创建的Connection添加到新来用户的Map集合中,并且以Map<ThreadLocal,Object>的方式存入。又因为这个Map是每一个线程(用户)所特有的,所以每个线程会从自己的Map中拿出属于自己的Connection,这样用户之间的Connection就不会发生混乱。

底层源码

当我们要将一个conn放入对应的线程中时调用threadLocal.set()代码如下:

public void set(T value) {

        Thread t = Thread.currentThread();

        ThreadLocalMap map = getMap(t);

        if (map != null)

            map.set(this, value);

        else

            createMap(t, value);

 }

当我们想要得到每个线程的conn时:

public T get() {

        Thread t = Thread.currentThread();

        ThreadLocalMap map = getMap(t);

        if (map != null) {

            ThreadLocalMap.Entry e = map.getEntry(this);

            if (e != null)

                return (T)e.value;

        }

        return setInitialValue();

 }

不难发现,get和set操作都是对当前线程做操作。

这就是著名的ThreadLocal。

原文地址:https://blog.csdn.net/qq_34993631/article/details/82343689

最新文章

  1. 好好写,好好干-PHP基础(二)
  2. poj2240 floyd
  3. Codeforces 369E Valera and Queries --树状数组+离线操作
  4. 为wordpress添加Canonical标签
  5. SQL Server 系统视图
  6. android项目在eclipse下编译运行的问题
  7. sourceInsight的技巧
  8. Clock Pictures
  9. Eclipse中Ctrl+Alt+Down和Ctrl+Alt+Up不起作用
  10. 条形图(diagrams)
  11. HMM Viterbi算法 详解
  12. BZOJ-9-3295: [Cqoi2011]动态逆序对
  13. Python打包—Pyinstaller
  14. CentOS7安装Jenkins,使用war方式直接运行或用yum方式安装运行
  15. Visual Studio编辑器“智能提示(IntelliSense)”异常的解决方案
  16. myeclipse优化 Maven
  17. Vue.js 登录注册实现
  18. IDEA里运行程序时出现Failed to execute goal org.scala-tools:maven-scala-plugin:2.15.2:compile(default) on Project DataFusion:wrap:org.apache.commons...错误的解决办法(图文详解)
  19. 知物由学 | AI网络安全实战:生成对抗网络
  20. d3.js 实现立体柱图

热门文章

  1. OpenCV func
  2. CodeVs——T 4919 线段树练习4
  3. 通达OA二次开发 对通达2015版微信查询用户信息模块升级开发(图文)
  4. 为SSO 5.5恢复忘记的administrator@vsphere.local密码
  5. Python 极简教程(三)数据类型
  6. 11995 - I Can Guess the Data
  7. proxool数据库连接池用法
  8. POJ 1745 Divisibility DP
  9. 排查一般MySQL性能问题
  10. jquery ajax 请求时间