閱讀445 返回首頁    go 阿裏雲 go 技術社區[雲棲]


麵試官問你ThreadLocal原理

如果麵試碰見讓你解釋ThreadLocal。怎麼解釋?
首先:ThreadLocal是線程封閉技術中的一種。那麼什麼是線程封閉?當訪問共享數據時,通常需要同步,一種避免使用同步的方式就是不共享數據,如果僅在單線程內訪問數據,就不需要同步,這種技術就是線程封閉。

然後:解釋Thread和ThreadLocal之間是什麼關係?
雖然是通過ThreadLocal來設置特定於各個線程的資源,但是ThreadLocal自身不會保存這些特點的數據資源,每個Thread類都有一個ThreadLocal.ThreadLocalMap類型的名為threadLocals的成員變量,那麼這個threadLocals就是用來保存哪些通過ThreadLocal設置給這個線程的數據資源的地方。看JDK,當通過ThreadLocal的set(data)方法來設置數據的時候,ThreadLocal會首先獲取當前線程的引用,然後是getMap(t)是吧,然後點進去這個getMap(t)方法,得到就是t.threadLocals。所以threadLocals就是保存。
舉例:以一個條高鐵線路作為例子說明Thread和ThreadLocal之間關係。
深圳到北京是一條高鐵線路,中途有長沙,武漢等站點。線路上跑的是和諧號,和諧號有很多,和諧號1,和諧號2......。
那麼這條高鐵線就是Thread,和諧號就是Thread的threadLocals,和諧號就是裝載保存乘客(數據資源),那麼武漢站,長沙站就是乘車點。乘車點就是ThreadLocal,乘車點的目的就是set(乘客)到和諧號(threadLocals)上去。那麼同一個乘車點(如武漢站)會為很多高鐵線路set(乘客),但是隻會將當前乘客指定到當前的正在停靠的和諧號(threadLocals)上去。也就是隻會將當前的數據資源指定到當前的線程中。
很多書上會將ThreadLocalMap,可以參考上麵總結講給麵試官聽一聽。

最後更新:2017-06-06 21:38:46

  上一篇:go  香港ECS上的MySQL數據同步到數加MaxCompute
  下一篇:go  python-代碼庫 :requests 模擬登陸網站