-
概念
ThreadLocal是Java中一個用于線程內(nèi)部存儲數(shù)據(jù)的工具類。ThreadLocal是用來存儲數(shù)據(jù)的曹铃,線程只能訪問到自己線程存儲的數(shù)據(jù)。 -
作用
ThreadLocal的特性適用于同樣的數(shù)據(jù)類型扮休,不同的線程有不同的備份情況蔗怠,這個時候就特別適合使用ThreadLocal來存儲數(shù)據(jù) -
內(nèi)部結(jié)構(gòu)
image.png
每個Thread,也就是每個線程內(nèi)部維護有一個ThreadLocalMap它匕,ThreadLocalMap內(nèi)部存儲多個Entry展融。Entry可以理解為鍵值對,他的本質(zhì)是一個弱引用豫柬,內(nèi)部有一個object類型的內(nèi)部變量告希,如下:
static class Entry extends WeakReference<ThreadLocal<?>> {
/** The value associated with this ThreadLocal. */
Object value;
Entry(ThreadLocal<?> k, Object v) {
super(k);
value = v;
}
}
Entry是ThreadLocalMap的一個靜態(tài)內(nèi)部類扑浸,這樣每個Entry里面就維護了一個ThreadLocal和ThreadLocal泛型對象
- 存取過程邏輯和 hashMap 比較相似
-
內(nèi)存泄露問題
我們會發(fā)現(xiàn)Entry中,ThreadLocal是一個弱引用燕偶,而value則是強引用喝噪。如果外部沒有對ThreadLocal的任何引用,那么ThreadLocal就會被回收指么,此時其對應的value也就變得沒有意義了酝惧,但是卻無法被回收,這就造成了內(nèi)存泄露伯诬。怎么解決晚唇?在ThreadLocal回收的時候記得調(diào)用其remove方法把entry移除,防止內(nèi)存泄露姑廉。 - 總結(jié)
- ThreadLocal適合用于在不同線程作用域的數(shù)據(jù)備份.
- ThreadLocal機制通過在每個線程維護一個ThreadLocalMap缺亮,其中 ThreadLocal為Entry的key, value為ThreadLocal對應的泛型對象,這樣每個ThreadLocal就可以作為key將不同的value存儲在不同Thread的Map中,當獲取數(shù)據(jù)的時候桥言,同個ThreadLocal就可以在不同線程的Map中得到不同的數(shù)據(jù)