相信很多做分布式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...