ThreadLocal原理詳解

2021-08-25 08:55:17 字數 1884 閱讀 5973

threadlocal稱為執行緒本地變數,其為變數在每個執行緒中都建立了乙個副本,每個執行緒都訪問和修改本執行緒中變數的副本。

應用示例:

可以看出,為每個執行緒分配乙個變數副本的工作並不是由threadlocal實現的,需要在應用層面實現,threadlocal只是提供乙個容器。如果在應用上為每個執行緒分配了同乙個物件例項,那threadlocal也無法保證執行緒安全。

4.3.1 threadlocal實現原理

threadlocal的內部實現,主要關注的就是set()和put()方法。

set()方法:

thread類內部有乙個例項變數:

threadlocal.threadlocalmap threadlocals = null;

在執行set()方法時首先獲得當前執行緒物件,通過getmap()得到當前執行緒的threadlocalmap(類似於hashmap的一種map,但是沒有實現map介面,所以嚴格地說,它只是一種類)。並將相應的資料存入到threadlocalmap中。該map中儲存了當前執行緒的所有的「本地變數」,也就是說當前執行緒可能有多個threadlocal類的例項,每個例項儲存的變數副本都在這個map中。寫入map中的鍵值對,鍵是呼叫set()方法的那個threadlocal例項,值就是副本變數。如果當前執行緒對應的map為空,則為該執行緒建立乙個threadlocalmap,並將鍵值對存入進去。

get()方法:

get()方法是先取得當前執行緒對應的threadlocalmap物件,然後將呼叫get()方法的threadlocal物件作為key取得對應的變數。如果該執行緒對應的map不存在,則為其建立threadlocalmap物件,並將鍵值對的key設為當前threadlocal,value置為空。如果map存在,對應的entry不存在,則初始化鍵值對如之前。

如果執行緒關閉,thread類會進行一些清理工作,包括清理threadlocalmap。但是如果使用執行緒池,由於執行緒可能並不是真正的關閉(比如newfixedthreadpool會保持執行緒乙隻存活)。因此,如果將一些大物件存放到threadlocalmap中,可能會造成記憶體洩漏。因為執行緒沒有關閉,無法**,但是這些物件不會再被使用了。如果希望及時**物件,則可以使用thread.remove()方法將變數移除。

threadlocal使用場景:最常見的threadlocal使用場景為用來解決資料庫連線、session管理等。

ThreadLocal原理詳解

首先,它是乙個資料結構,有點像hashmap,可以儲存 key value 鍵值對,但是乙個threadlocal只能儲存乙個,並且各個執行緒的資料互不干擾。1 threadlocallocalname new threadlocal 2 localname.set 尋夢 3 string name...

ThreadLocal用法詳解和原理

一 用法 threadlocal用於儲存某個執行緒共享變數 對於同乙個static threadlocal,不同執行緒只能從中get,set,remove自己的變數,而不會影響其他執行緒的變數。1 threadlocal.get 獲取threadlocal中當前執行緒共享變數的值。2 threadl...

ThreadLocal原理探尋

筆者今天趁著專案空隙,學習了下threadlocal這個類,探尋了下多執行緒下如何實現執行緒安全的原理。分享下 package com.suning.sample.transcation public class threadtest public static void main string a...