摘要:下來我們來看中的方法。從中可以看到真正保存的是在中,接著看看的源碼。數組的初始長度為,最多可保存一旦超過就進行擴容增加一倍。而內部利用數組來保存和值的,數組的索引就是的哈希值數組的長度。
在Android-27中查看源碼:
在Looper源碼中,我們看到通過ThreadLocal的set方法來保存Looper,通過get方法來取出Looper。下來我們來看ThreadLocal中的set/get方法。
public void set(T value) { Thread t = Thread.currentThread(); ThreadLocalMap map = getMap(t); if (map != null) map.set(this, value); else createMap(t, value); } ThreadLocalMap getMap(Thread t) { return t.threadLocals; } void createMap(Thread t, T firstValue) { t.threadLocals = new ThreadLocalMap(this, firstValue); } public T get() { Thread t = Thread.currentThread(); ThreadLocalMap map = getMap(t); if (map != null) { ThreadLocalMap.Entry e = map.getEntry(this); if (e != null) { @SuppressWarnings("unchecked") T result = (T)e.value; return result; } } return setInitialValue(); } private T setInitialValue() { T value = initialValue(); Thread t = Thread.currentThread(); ThreadLocalMap map = getMap(t); if (map != null) map.set(this, value); else createMap(t, value); return value; }
從中可以看到真正保存的是在Thread.threadLocals中,接著看看ThreadLocalMap的源碼。
ThreadLocalMap(ThreadLocal> firstKey, Object firstValue) { table = new Entry[INITIAL_CAPACITY]; int i = firstKey.threadLocalHashCode & (INITIAL_CAPACITY - 1); table[i] = new Entry(firstKey, firstValue); size = 1; setThreshold(INITIAL_CAPACITY); } private void set(ThreadLocal> key, Object value) { // We don"t use a fast path as with get() because it is at // least as common to use set() to create new entries as // it is to replace existing ones, in which case, a fast // path would fail more often than not. Entry[] tab = table; int len = tab.length; int i = key.threadLocalHashCode & (len-1); for (Entry e = tab[i]; e != null; e = tab[i = nextIndex(i, len)]) { ThreadLocal> k = e.get(); if (k == key) { e.value = value; return; } if (k == null) { replaceStaleEntry(key, value, i); return; } } tab[i] = new Entry(key, value); int sz = ++size; if (!cleanSomeSlots(i, sz) && sz >= threshold) rehash(); }
在ThreadLcoalMap中創建了數組,利用數組來保存Entry,Entry中保存了ThreadLocal和值。數組的初始長度為16,最多可保存length/2一旦超過就進行擴容(增加一倍)。
所以ThreaLocal的作用是用來實現線程內部的數據共享,其實現原理是利用線程內部的ThreaLocalMap來保存數據。而ThreadLocalMap內部利用數組來保存ThreadLocal和值的,數組的索引就是ThreadLocal的哈希值&(數組的長度-1)。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/72114.html
摘要:雖然類名中帶有字樣,但是實際上并不是接口的子類。是弱連接接口,這意味著如果僅有指向某一類,其任然有可能被回收掉。這里使用弱連接的意義,是為了防止業務代碼中置空對象,但是由于存在連接可達,所以仍然無法回收掉該對象的情況發生。 零 前期準備 0 FBI WARNING 文章異常啰嗦且繞彎。 1 版本 JDK 版本 : OpenJDK 11.0.1 IDE : idea 2018.3 2 T...
摘要:在深入理解中的變量上中我們看到的引入,使得可以很方便地在多線程環境中使用局部變量。特別需要注意的是,基類的并不會屏蔽派生類中的創建。到此,整個源碼核心部分已經理解的差不多了,只剩下用來執行清除工作。 在 深入理解Python中的ThreadLocal變量(上) 中我們看到 ThreadLocal 的引入,使得可以很方便地在多線程環境中使用局部變量。如此美妙的功能到底是怎樣實現的?如果你...
摘要:返回索引位置的值。因為依賴于靜態成員變量的關系,所以它的肯定唯一獲取當前線程。位置還沒有初始化第一次這個,直接將放到的位置。在線程池模式下,生命周期伴隨著線程一直存在,可能出現內存泄漏的情況,最好手動調用方法。 本文原創地址,:jsbintask的博客(食用效果最佳),轉載請注明出處! 前言 ThreadLocal是jdk中一個非常重要的工具,它可以控制堆內存中的對象只能被指定線程訪問,如...
閱讀 2902·2023-04-26 02:14
閱讀 3751·2019-08-30 15:55
閱讀 1843·2019-08-29 16:42
閱讀 2757·2019-08-26 11:55
閱讀 2846·2019-08-23 13:38
閱讀 480·2019-08-23 12:10
閱讀 1308·2019-08-23 11:44
閱讀 2790·2019-08-23 11:43