面試官問你為什麼做多數據源切換時,會使用到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以耗費內存為代價。


分享到:


相關文章: