ThreadLocal的原理和使用

2021-08-22 03:29:07 字數 1205 閱讀 5706

前幾天有一篇文章分享了******dateformat類在多執行緒情況下不安全的問題,文章中也提到了使用threadlocal來解決的這種辦法,今天就來給大家介紹一下threadlocal。

由於******dateformat類執行緒不安全,所以我們不能用public static修飾乙個******dateformat變數來共多個執行緒使用。

既然多個執行緒不能公用同乙個******dateformat物件,那麼每次使用到******dateformat類的時候new乙個新的物件出來就能解決併發問題。

但是******dateformat類只是在多執行緒場景下不安全,單執行緒的使用場景下它還是很優秀的,所以乙個執行緒多次建立******dateformat物件會顯得浪費資源。

既然多執行緒下不安全,每次需要使用時new新物件又浪費資源,那麼有乙個新的思路就是在每個執行緒中都建立乙個******dateformat物件,每次需要使用它的時候從執行緒中取,這樣就很合理的解決了我們的問題了。

threadlocal,叫做執行緒本地變數。threadlocal會為變數在每個執行緒中都建立了乙個副本,每個執行緒可以訪問自己內部的副本變數。我們可以把threadlocal可以比喻成乙個盒子,每個執行緒有乙個自己的盒子儲存自己的私有資料

當然了,由於threadlocal會占用執行緒的記憶體,所以過度的使用threadlocak會導致記憶體資源的浪費。

首先,在每個執行緒thread內部有乙個threadlocal.threadlocalmap型別的成員變數threadlocals,這個threadlocals就是用來儲存實際的變數副本的,鍵值為當前threadlocal變數,value為變數副本(即t型別的變數)。

- 初始時,在thread裡面,threadlocals為空,當通過threadlocal變數呼叫get()方法或者set()方法,就會對thread類中的threadlocals進行初始化,並且以當前threadlocal變數為鍵值,以threadlocal要儲存的副本變數為value,存到threadlocals。

- 然後在當前執行緒裡面,如果要使用副本變數,就可以通過get方法在threadlocals裡面查詢。

- 沒有set之前直接get,返回值null,想要解決這個問題,可以重寫initialvalue()方法給予預設值。

public

class

run

}class threadlocaltest ;

};}

ThreadLocal的作用和原理

threadlocal是用來建立當前執行緒的區域性變數的類,建立的變數只能被當前執行緒訪問和修改 原理 set方法的原理 1.首先獲取當前執行緒物件 2.利用當前執行緒獲取threadlocalmap物件 3.如果threadlocalmap物件不為空,則設定值,否則建立這個map物件並設定值 由此...

ThreadLocal的作用和實現原理

threadlocal是乙個執行緒內部的資料儲存類,通過它可以在指定的執行緒中儲存資料,資料儲存以後,只有在指定的執行緒中可以獲取到儲存的資料,對於其他執行緒來說則無法取到資料。threadlocal的主要作用 輕鬆實現一些看起來很複雜的功能,適合以下一些應用場景。某些資料是以執行緒為作用域並且不同...

ThreadLocal用法詳解和原理

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