ThreadLocal 原始碼分析 jdk1 6

2021-07-25 09:34:00 字數 2474 閱讀 2070

相信很多做分布式web開發的都封裝過這樣的乙個工具用來管理當前登入的使用者。

在***裡面把使用者set進來

在controller 裡面get 出來使用

而且都是基於threadlocal 這個模板類來封裝的, 出於好奇跟蹤進原始碼一**竟

這裡簡單寫個例子

public

class

baselogincontext

extends

baselogincontext>

public

static baselogincontext get()

protected

static

void set(baselogincontext context)

}

public

class logincontext extends

baselogincontext

return getcurrentuser().getpk();

}public

static boolean islogin()

return getcurrentuserid() > 0;

}public

static unionuser getcurrentuser()

user user = logincontext.getuser();

return user;

}public user getuser()

static

public

void

addcurrentuser(user user)

context.setuser(user);

}public

void

setuser(unionuser user)

}

先看一下threadlocal的set

/**

public void set(t value)

至於為什麼 我們下面講述

如果threadlocalmap 為空 就呼叫createmap 建立乙個引數為當前執行緒和要放入的引數。

下面我們先看看 getmap

threadlocalmap getmap(thread t)
這裡直接返回執行緒的成員變數threadlocals,在thread中定義了threadlocal.threadlocalmap threadlocals = null;

這裡看到 threadlocalmap 是threadlocal的內部類,這個我們可以在threadlocal中找到,有點類似與map 的乙個東西,用法也很類似,就理解成乙個map也可以 ,這塊就不詳細說明了, 那麼現在我們來看一下createmap

void createmap(thread t, t firstvalue)
這裡給當前執行緒建立乙個threadlocalmap ,

現在我們看一下 threadlocal的get

public t get() 

return setinitialvalue();

}

同樣也是獲取當前執行緒,然後拿到當前執行緒的threadlocalmap 然後取出key為this 也就是本物件的值。

如果 map 為空 獲取乙個初始化的值 (其實就是null)

我們可以看一下setinitialvalue實現

private t setinitialvalue()
protected t initialvalue()
呼叫initialvalue獲取乙個預設值 ,其實原始碼可以看到initialvalue什麼都沒乾直接返回null。然後的流程和set 一樣 (真好奇這裡獲取預設值後為什麼不直接呼叫set ,估計是不利於以後改動。萬一set變化會影響到)

remove就沒什麼可說的了很簡單

public

void

remove()

一樣的邏輯獲取當前執行緒 ,獲取threadlocalmap 然後移除本身就可以了;

thread 中有成員變數threadlocalmap threadlocals;是實現threadlocal的基礎。threadlocals 在每乙個執行緒中都屬於執行緒獨自的。

當我們實現乙個threadlocal ,threadlocals 中就會增加乙個鍵值對。key 就是我們例項化的threadlocal,value 就是我們要儲存到本地執行緒的值,key 傳this 就把我們例項化的threadlocal物件作為鍵存在threadlocals 中,這樣我們實現多個threadlocal 的時候 threadlocals 都可以支援,也都能保證threadlocal 取到的是自己存放的值。

(剛開始寫部落格,文字表達能力有限,正在努力學習,請多多見諒)

ThreadLocal實現原理與原始碼分析

threadlocal底層實現內部類 threadlocalmap 一 threadlocal的set方法原始碼分析 1 public void set t value thread t thread.currentthread threadlocalmap map getmap t if map ...

ThreadLocal原始碼理解

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

ThreadLocal原始碼分析

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