面试官问你为什么做多数据源切换时,会使用到ThreadLocal

前言:首先说下什么是多数据源?无论是在学时中还是实际开发中,很多项目都是单数据源,比如连接mysql。但是还是有一些项目需要多数据源的。

①、项目中存储的数据量很大,一个服务器扛不住,需要讲一部分数据存储在另外一个服务器里,然而我们还要每天去访问这些存储的数据。

②、项目与其他项目对接,需要连接另外一个项目的数据库(这里可能有人会提议使用API,但这是相对于第三方公司,人家不会把数据库信息暴露给你的,所以才提供的api。)

在网上百度,发现多数据源切换都会使用到ThreadLocal,如图:

面试官问你为什么做多数据源切换时,会使用到ThreadLocal

多数据源

这是小编在开发多数据源中的代码。相信没有使用过ThreadLocal的伙伴,看到这段代码肯定很陌生。先解释下ThreadLocal是什么?ThreadLocal一般称为线程本地变量,它是一种特殊的线程绑定机制,将变量与线程绑定在一起,为每一个线程维护一个独立的变量副本。通过ThreadLocal可以将对象的可见范围限制在同一个线程内。更直白点讲,ThreadLocal可以理解为将对象的作用范围限制在一个线程上下文中,使得变量的作用域为“线程级”。ThreadLocal将变量绑定在线程上,在一个线程周期内,无论“你身处何地”,只需通过其提供的get方法就可轻松获取到对象。极大地提高了对于“线程级变量”的访问便利性。

查看ThreadLocal的源码

面试官问你为什么做多数据源切换时,会使用到ThreadLocal

ThreadLocal的源码

可以看到内部有一个ThreadLocalMap,每次都会获取当前线程,在从当前线程中插入或拿取值,这样就保证了只能当前线程能插入和拿取自己的值,其他线程是访问不到的。这样也就避免了传参问题。(脑补下,比如一个值好几个方法都要用到,普通的做法就是一个一个方法传递下去,但是使用ThreadLocal后,调用get方法就可以拿到参数值了,是不是很方便),在多数据源中,会频繁的调用数据库,采用传参来决定使用什么数据源肯定是不可取的,采用ThreadLocal完美解决数据库切换问题。缺点就是以空间换时间的方式(与synchronized相反),以耗费内存为代价,但是大大减少了线程同步(如synchronized)所带来性能消耗以及减少了线程并发控制的复杂度。

总结:

  1. ThreadLocal是什么?它就是线程本地变量,保证每个线程都能设置和拿到自己的值,其他线程被拒之门外。
  2. ThreadLocal解决传参问题。
  3. ThreadLocal以耗费内存为代价。


分享到:


相關文章: