ThreadLocal 用途與使用場景

2021-09-24 23:13:02 字數 1519 閱讀 4329

threadlocal,即執行緒變數,是乙個以 threadlocal 物件為鍵、任意物件為值的儲存結構。

概括起來說,對於多執行緒資源共享的問題,同步機制採用了「以時間換空間」的方式,而 threadlocal 採用了「以空間換時間」的方式。前者僅提供乙份變數,讓不同的執行緒排隊訪問;後者為每乙個執行緒都提供了乙份變數,因此可以同時訪問而互不影響。

threadlocal 類主要有如下方法:

protected t initialvalue():設定初始值,預設為null

public void set(t value):設定乙個要儲存的值,並會覆蓋原來的值

public t get():獲得儲存的值,如果沒有用過set方法,會獲取到初始值

public void remove():移除儲存的值

一般 threadlocal 作為全域性變數使用,示例如下:

public class connectionmanager

} catch (sqlexception e)

return conn;}

public static void close()

} catch (sqlexception e) }}

threadlocal解決共享引數

threadlocal 也常用在多執行緒環境中,某個方法處理乙個業務,需要遞迴依賴其他方法時,而要在這些方法中共享引數的問題。

例如有方法 a(),在該方法中呼叫了方法b(),而在方法 b() 中又呼叫了方法 c(),即 a–>b—>c。如果 a,b,c 現在都需要使用乙個字串引數 args。

常用的做法是 a(string args)–>b(string args)—c(string args)。但是使用threadlocal,可以用另外一種方式解決:

在某個介面中定義乙個threadlocal 物件

方法 a()、b()、c() 所在的類實現該介面

在方法 a()中,使用 threadlocal.set(string args) 把 args 引數放入 threadlocal 中

方法 b()、c() 可以在不用傳引數的前提下,在方法體中使用 threadlocal.get() 方法就可以得到 args 引數

示例如下:

inte***ce threadargs

class a implements threadargs }

class b implements threadargs }

class c implements threadargs }

public class threadlocaldemo

}輸出結果:

hello

hello

12關於 inheritablethreadlocal

inheritablethreadlocal 類是 threadlocal 類的子類。threadlocal 中每個執行緒擁有它自己的值,與 threadlocal 不同的是,inheritablethreadlocal 允許乙個執行緒以及該執行緒建立的所有子執行緒都可以訪問它儲存的值。

參考:

ThreadLocal的作用與使用

在我們程式設計時,如果遇到多個執行緒訪問同乙個變數應該怎樣實現?有人說使用同步。是的同步可以解決這種問題,但它是有弊端的,涉及到何時加鎖與釋放鎖等並且執行緒訪問鎖時需要等待,這樣很浪費時間。有乙個更好的方案就是使用threadlocal工具類,之前參加了乙個專案,本專案涉及到分庫,在業務進行中需要根...

ThreadLocal使用與原理探索

threadlocal與synchronized的區別是 threadlocal 每個執行緒單獨有乙個副本 synchronized 共用同乙個資源,加鎖 顯然threadlocal是用空間換時間 threadlocal大致儲存是這樣的 每個執行緒有乙個threadlocalmap,即使不同的thr...

static的用法與用途

static全域性變數與普通的全域性變數有什麼區別?static區域性變數和普通區域性變數有什麼區別?static函式與普通函式有什麼區別?全域性變數 外部變數 的說明之前再冠以static 就構成了靜態的全域性變數。全域性變數本身就是靜態儲存方式,靜態全域性變數當然也是靜態儲存方式。這兩者在儲存方...