ThreadLocal源碼理解

TedVgu 8年前發布 | 6K 次閱讀 安卓開發 Android開發 移動開發

緣起

平時開發、看源碼經常會遇到ThreadLocal的使用,一直以來理解的不是那么清晰,只知道內部應該是某種類似map的實現,從而達到不同的線程調用get可以獲取到不一樣的值,僅此而已。趁著前一陣子中秋放假,正好有空,遂決定一探究竟,接下來我主要列下對源碼的理解。

注意:本文研究的源碼版本是Android6.0 sdk里的,實現有別于JDK中的版本。

1. 含義&用法

線程本地存儲對象,同一個對象實例可以在多個Thread中操作,每個線程可以在這個對象上設置一個關聯的值,各個線程看到的都是自己的值,互相之間不會影響;

在代碼中一般作為靜態字段使用,如Looper.java里面的:

// sThreadLocal.get() will return null unless you've called prepare().
static final ThreadLocal<Looper> sThreadLocal = new ThreadLocal<Looper>();

2. 初始值

可以通過覆寫initialValue()方法提供個自定義的值;

3. set方法

代碼如下:

public void set(T value) {
        Thread currentThread = Thread.currentThread();
        Values values = values(currentThread); // 拿到跟當前線程關聯的values字段
        if (values == null) {
            values = initializeValues(currentThread);
        }
        values.put(this, value); // 將this、value對,放到這個結構中
    }

/**
 * Gets Values instance for this thread and variable type.
 */
Values values(Thread current) {
    return current.localValues;
}</code></pre> 

每個Thread對象有一個這里的Values類型的localValues字段。

4. Values結構:

Values結構

這里的重點是里面的 private Object[] table; 數組;

因為同一個線程可以創建多個ThreadLocal對象,所以這里用了一個數組來存儲!!!數組中的存儲方式是接連著存放,比如0,1位置是一對,分別對應key(ThreadLocal對象本身)、value,2和3位置是一對等等,數組長度一定是2的power(次方)。

 

來自:http://www.jianshu.com/p/c88024c3fc20

 

 本文由用戶 TedVgu 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!