ThreadLocal原理解析

2021-12-29 22:27:06 字數 2120 閱讀 5026

threadlocal原理解析:這偏文章其實是接著上一篇文章來的,因為在安卓訊息機制中是用threadlocal來儲存各個執行緒的looper物件,所以這篇文章專門來講一下這個特殊的類。threadloacal的作用其實很簡單:可以儲存不同執行緒中的資料。用**給你解釋一下:

public class mainactivity extends appcompatactivity

}).start();

new thread(new runnable()

}).start();

}}輸出結果:

main thread: false

thread(1): true

thread(2): false這裡我建立了乙個threadlocal物件,泛型給的是boolean,然後在3個執行緒中給threadlocal中新增資料,然後再列印結果,發現每個執行緒各自的資料完全不會互相影響,利用這個特性可以完成一些比較特殊的要求。threadlocal中主要有2個方法,get()方法和set()方法,乙個取資料乙個存資料,我們來看一下原始碼:

public void set(t value) 首先會把當前的執行緒賦值給t,然後會通過getmap()方法返回乙個threadlocalmap例項,如果這個map為空,則建立乙個新的,如果map不為空,直接把value設定到map中。這個threadlocalmap是threadlocal中乙個靜態的內部類

static class threadlocalmap

}threadlocalmap的構造方法中,新建乙個entry陣列,然後通過傳進來的firstkey的hash值生成乙個下標(次下標唯一),然後用firstkey和firstvalue建立乙個entry存放在table陣列下標為i的地方,記錄陣列的大小為1。這個entry是threadlocalmap的乙個靜態內部類:

static class entry extends weakreference

}這裡用到了弱引用,估計是考慮到記憶體問題。這個entry就是用來儲存threadlocal和value的乙個物件。

我們再回頭看一下threadlocalmap的set方法做了什麼:

private void set(threadlocal key, object value)

if (k == null)

}tab[i] = new entry(key, value);

int sz = ++size;

if (!cleansomeslots(i, sz) && sz >= threshold)

rehash();

}別看這裡這麼多**,其實和threadlocalmap的構造方法做了同樣的事情:通過key得到乙個下標i,然後把entry物件存放到下標為i的陣列中。

thread類中都有有乙個threadlocalmap變數:

public class thread implements runnable 讓我們來理一下:

1. entry物件有點類似於hashmap,儲存是threadlocal和value

2. threadlocal內部會有乙個entry陣列用來儲存entry物件

3. 每個thread中有乙個threalocalmap變數,在呼叫threadlocal的set方法時,其實會去呼叫threadlocalmap的set方法,這個方法會通過thread計算出乙個唯一的下標i(每個執行緒都會不同),然後new乙個entry物件,把threadlocal和value放進去,儲存到threadlocal中的entry陣列中,下標為i

4. 通過第三點的解釋,理解了set方法之後,get方法就很簡單了,首先通過thread計算出下標,到entry陣列中通過下標找到entry,就可以獲取value了

public t get()

return setinitialvalue();

}private entry getentry(threadlocal key) 安卓訊息機制中使用threadlocal來儲存looper是很合適的,試著想一下,如果不用threadlocal,我要儲存各個執行緒的looper物件是不是非常麻煩?要麼就提供乙個全域性的靜態變數來儲存或者其他的方法,都是非常繁瑣且有侷限性的。雖然在平時的時候可能用不到,但是由於threadlocal的特殊性,在遇到特殊的問題的時候說不定可以迎刃而解,恰到好處。

ThreadLocal原理詳細解析

threadlocal,可以叫做執行緒本地變數或執行緒本地儲存,顧名思義就是threadlocal為變數在每個執行緒中都建立了乙個副本,那麼每個執行緒可以訪問自己內部的副本變數。其實就是通過空間換時間的方式來取得對每個執行緒各自變數的共享。變數值的共享可以使用 public static 變數的形式...

深入解析ThreadLocal

2 深入解析threadlocal類 threadlocal提供了執行緒區域性變數,可以視為內部通過乙個內部類threadlocalmap訪問資料,訪問資料只在同一執行緒有效也就是說 不同執行緒只能從中get,set,remove自己的變數,而不會影響其他執行緒的變數。在上面談到了對threadlo...

ThreadLocal原理探尋

筆者今天趁著專案空隙,學習了下threadlocal這個類,探尋了下多執行緒下如何實現執行緒安全的原理。分享下 package com.suning.sample.transcation public class threadtest public static void main string a...