注:如下內容基於Android API Version 27(Android 8.1)Linux Kernel 3.18.0git
線程局部存儲是用來解決線程對資源的競爭的方式之一,它的思想是將數據和線程關聯起來,這份數據只有在當前線程的整個調用棧中時可見的,在其餘線程不可見。線程局部存儲的數據能夠認爲是線程私有數據,線程各用各的數據也就不存在競爭問題了。github
線程局部存儲還有另外一個做用是在整個線程的調用棧中共享同一個變量,這樣就免去了調用棧中全部函數都聲明同一個參數的煩惱。函數
在Java層線程局部存儲是藉助ThreadLocal
類實現的,在Native層是藉助pthread_key_create/pthread_setspecific/pthread_getspecific
三個函數實現的。線程
不管是Java層仍是Native能,線程局部存儲的本質原理是類似的,能夠簡單概括爲:使用一個map保存全部線程的局部數據,map的key是線程的id,value就是所要存儲的數據。因此線程局部存儲背後並無什麼魔法,你能夠以任何方式實現線程局部存儲,只要保證經過線程ID能找到關聯在線程ID上的數據就行。code
固然上面說的都是動態的線程局部存儲,若是是在編譯期間就肯定的靜態線程局部存儲就有點不一樣了。具體能夠參考這篇文章:A Deep dive into (implicit) Thread Local Storagecdn