最近在看spring,了解到spring中絕大部分的bean都可以宣告為singleton的,是因為spring對bean中的一些非執行緒安全的狀態採用threadlocal來處理,讓他們變成了執行緒安全的bean。例如在transcationsynchronizationmanaer中:
public
abstract
class
transcationsynchronizationmanager
threadlocal 是如何儲存變數的呢?首先在thread類中有乙個變數threadlocals,型別為threadlocal中的靜態內部類threadlocalmap,該變數是儲存的實體。
threadlocal.threadlocalmap threadlocals =null;
threadlocalmap是threadlocal中的靜態內部類,建構函式宣告如下:
threadlocalmap(threadlocal<?> firstkey, object firstvalue)
從上面的**可以看到,threadlocalmap有點類似於hashmap的儲存。鍵為theadlocal型別的變數,值為所要儲存的與該threadlocal型別的變數的繫結值。table是乙個陣列,儲存的變數型別為entry,但是entry中並沒有定義用於解決hash衝突的next指標,這裡採用的是線性探測再雜湊的方法解決衝突。
然後,就可以在threadlocal中可以呼叫get()方法來獲取指定的值。
//threadlocal中的方法
public t get()
}return setinitialvalue();
}//threadlocalmap中的方法
private entry getentry(threadlocal<?> key)
如果要往threadlocalmap中插入值
public
void
set(t value)
//threadlocalmap中的變數
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();
}
另外附執行緒安全的幾個層次:
1. 使用無狀態物件
2. 執行緒封閉
3. 採用同步技術
其中執行緒封閉又包括 ad-hoc執行緒封閉,棧封閉,使用threadlocal
對ThreadLocal 的一點自己的理解
先貼兩段 public void set t value threadlocalmap getmap thread t public t get return setinitialvalue threadloacl 類的實質就是 把我們new出來的threadlocal的例項作為key,以我們set...
ThreadLocal原始碼解析及一點思考
看乙個案例 public static void main string args other thread thread.start 輸出 main other threadthreadlocal的作用顯而易見 某變數是執行緒共享變數,但某執行緒下對其的操作僅對該執行緒可見 看下threadloc...
理邦公益 點亮繁星 永遠不止一點 永遠多做一點
11 月的深圳仍是溫暖的,除了晴朗的天氣以外,也因著 11 月是感恩的時節。值此感恩節之際,理邦聯合深圳市寶安人民醫院 深圳慈海醫院以及大鵬新區婦幼保健院在深圳聚龍山公園舉辦了一vseiugfku場愛心義診活動,惠及了 20 餘名周邊居民。本次義診最大的亮點是心電篩查專案,通過se 301 多道心電...