衆所周知,ThreadLocal對象可以每一個線程儲存一份值,可以避免因線程間共享資料帶來的問題。
其實作的原理,大緻如下,具體的可以參考JDK裡的源碼。
Thread類中,有一個threadLocals字段,它是ThreadLocalMap類型(ThreadLocal裡的一個靜态内部類)。該字段存放目前線程下,所有與ThreadLocal相關的值。該對象是一個Map,key為ThreadLocal對象,value為所存放的值。
在ThreadLocal類裡,有兩個重要的方法:set()和get()。
其實作原理是,擷取目前線程的ThreadLocalMap對象,然後根據目前ThreadLocal對象,在Map中查找對應的值或者設定對應的值。
從上面的描述可以知道,ThreadLocal可以設定成static類型,不會造成線程不安全的問題。但在同一個線程内,由于ThreadLocal對象是static的,是以對于包含該對象的類,操作它不同的執行個體時,是可能會對ThreadLocal對應的值進行修改的。
ThreadLocalMap,實作機制比HashMap簡單,内部是一個數組,然後用線性擴充來解決hash沖突。