ThreadLocal的原始碼分析

2021-08-01 22:21:48 字數 1093 閱讀 2569

首先是thread類的原始碼:

threadlocal.threadlocalmap threadlocals = null;
threadlocal原始碼:

public t get() 

}return setinitialvalue();

}public void set(t value)

由以上兩段**可以發現,當對threadlocal**進行set和get時,實際上是對乙個threadlocalmap進行操作,

而這個threadlocalmap物件是使用當前執行緒物件傳遞給getmap方法得到的乙個map物件。而getmap方法是怎麼拿到當前執行緒的threadlocalmap物件呢?

threadlocalmap getmap(thread t)
void createmap(thread t, t firstvalue)
首先,在每個執行緒thread內部有乙個threadlocal.threadlocalmap型別的成員變數threadlocals,這個threadlocals就是用來儲存實際的變數副本的,鍵值為當前threadlocal變數,value為變數副本(即t型別的變數)。

初始時,在thread裡面,threadlocals為空,當通過threadlocal變數呼叫get()方法或者set()方法,就會對thread類中的threadlocals進行初始化,並且以當前threadlocal變數為鍵值,以threadlocal要儲存的副本變數為value,存到threadlocals。

然後在當前執行緒裡面,如果要使用副本變數,就可以通過get方法在threadlocals裡面查詢。

總結:threadlocal物件 實際上是對當前執行緒的threadlocalmap物件引用的乙個封裝(副本),threadlocal物件的set和get方法,實質上是對當前執行緒物件的threadlocalmap的set和get方法。

ThreadLocal原始碼理解

threadlocal其實原理是建立了多份相同資料儲存在堆記憶體上,每個執行緒的thread類裡有threadlocal.threadlocalmap threadlocals的屬性來指向存位置,所以每個執行緒修改都不會影響到其他執行緒的資料 首先說下下面用到的東西 threadlocalmap為t...

ThreadLocal原始碼分析

在理解handler looper之前,先來說說threadlocal這個類,聽名字好像是乙個本地執行緒的意思,實際上它並不是乙個thread,而是提供乙個與執行緒有關的區域性變數功能,每個執行緒之間的資料互不影響。我們知道使用handler的時候,每個執行緒都需要有乙個looper物件,那麼and...

ThreadLocal 原始碼解讀

在正式讀 前先簡單介紹threadlocal的實現方式。每個執行緒都會有乙個threadlocalmap,只有在使用到threadlocal的時候才會初始化threadlocalmap。需要儲存的物件t會被放到entry裡面儲存在threadlocalmap的陣列中,entry是乙個鍵值對的資料結構...