JDK原始碼解析 ThreadLocal

2021-08-14 08:00:25 字數 1930 閱讀 9124

說明:本文是jdk 1.8版本

1.簡介:

threadlocal 又叫做執行緒本地變數,也被稱為執行緒本地儲存。threadlocal 為 變數 在每乙個執行緒中建立 乙個 副本(不是原來變數的引用),每乙個執行緒都會獨自擁有變數副本,而不會相互影響。

2.實現方式:

(1)set 方法,,因為執行緒thread 類中 內建了 threadlocal.threadlocalmap 型別的引用threadlocals,所以 set方法把把 使用者變數 儲存到執行緒的  變數threadlocals中

public void 

set(t value)

threadlocalmap getmap(thread t)

void 

createmap(thread t,

t firstvalue)

threadlocalmap 裡面 使用了entry 儲存資料,鍵 為 threadlocal,值為使用者變數

static class threadlocalmap 

}

(2) get方法,獲取當前執行緒中儲存的使用者變數

public 

t get()

}return setinitialvalue();//設定初始化的值

}

private 

t setinitialvalue()

protected 

t initialvalue()

3.**驗證 使用者變數是否存放到 執行緒中:

方式一:不重寫initialvalue方法

public class threadlocaldemo1 

public void

show()

public static void

main(string args) throws exception

};t.start();

t.join();

demo1.show();

}}

輸出結果:

1main

11thread-0

1main

之前存放的值,因此可以看到 他們是 在每個執行緒中 建立了副本

方式二:重寫initialvalue方法

public class threadlocaldemo2 

};threadlocallongthreadlocal = new threadlocal()

};public void

show()

public static void

main(string args) throws exception

};t.start();

t.join();

demo1.show();

}}

輸出結果:

1main

11thread-0

1main

threadlocal 經常在管理資料庫連線,session 管理 中使用 :

使用場景的**摘抄自(摘抄自:

private static threadlocalconnectionholder

= new threadlocal()

};

private static final threadlocal threadsession 

= new threadlocal();

public static session getsession() throws infrastructureexception

} catch (hibernateexception ex)

return s;

}

JDK原始碼解析 StringBuilder

stringbuilder和stringbuffer一樣,都是繼承自抽象類abstractstringbuilder類,也是乙個可變的字串行。stringbuilder和stringbuffer非常相似,甚至有互相相容的api,不過,stringbuilder不是執行緒安全的,這是和stringbu...

JDK原始碼解析 LinkedHashSet

linkedhashset是set集合的乙個實現,具有set集合不重複的特點,同時具有可 的迭代順序,也就是我們插入的順序。底層實現是linkedhashmap 所以僅在構造方法上和hashset有所區別 linkedhashmap和linkedhashset都可以做到有序,但是不同點在於。link...

JDK原始碼解析 Stack

stack是棧的實現類,棧的特點是先進後出。繼承了vector,重寫了5個方法,對vector進行了擴充套件。繼承了vector 3.1push 呼叫父類的addelement方法,新增到陣列的尾部,也就是棧頂 public e push e item 3.2 pop 出戰操作。public syn...