ThreadLocal源碼理解
緣起
平時開發、看源碼經常會遇到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 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!