ThreadLocal簡單了解

2021-07-12 02:51:09 字數 1689 閱讀 3117

threadlocal,執行緒本地量。threadlocal為變數在每個執行緒都建立了乙個副本,那麼每個執行緒可以訪問自己內部的

副本變數。

threadlocal的具體實現:

public t get(){}

public void set(t valude){}

public void remove(){}

protected t initialvalue(){}

get()方法是用來獲取threadlocal在當前執行緒中儲存的變數副本,set()用來設定當前執行緒中變數的副本,

remove()用來移除當前執行緒中變數的副本,initialvalue()是乙個protected方法,一般是用來在使用時進行重寫

的,他是乙個延遲載入的方法。

get方法的實現

第一句取得當前執行緒,然後根據getmap(t)方法獲取到乙個map,map的型別threadlocalmap。然後接著下面獲取到

public t get()

} return setinitialvalue();

}

鍵值對。

threadlocalmap getmap(thread t)
在getmap中,是呼叫當前執行緒t,返回當前執行緒中的乙個成員變數threadlocals

threadlocals是乙個threadlocalmap,這個型別是threadlocal類的乙個內部類。

static class threadlocalmap

} }

threadlocalmap的entry繼承了weakreference,並且使用threadlocal作為鍵值

private t setinitialvalue()else

return value;

}

如果map不為空,就設定鍵值對,為空,在建立map

void createmap(thread t,t value)
threadlocal如何為每個執行緒建立變數的副本:

首先,在每個執行緒thread內部有乙個threadlocal。threadlocalmap型別的成員變數threadlocals,這個

threadlocals就是用來儲存實際的變數副本的,鍵值為當前的threadlocal變數,value為變數副本。

初始時,在thread裡面,threadlocals為空,當通過threadlocal變數呼叫get()方法或者set()方法,就會對

thread類中的threadlocals進行初始化,並且以當前threadlocal變數為鍵值,以threadlocal要儲存的副本變數

為value,存到threadlocals。

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

總結:

(1)實際的通過threadlocal建立的副本是儲存在每個執行緒自己的threadlocals中的

(2)為何threadlocals的型別threadlomap的鍵值為threadlocal物件,因為每個執行緒可有多個threadlocal變數

(3)在進行get之前,必須先set,否則匯報空指標異常。

輕鬆了解threadlocal

threadlocal是什麼 threadlocal是乙個關於建立執行緒區域性變數的類。通常情況下,我們建立的變數是可以被任何乙個執行緒訪問並修改的。而使用threadlocal建立的變數只能被當前執行緒訪問,其他執行緒則無法訪問和修改。local local 意思是該執行緒的threadlocal...

深入了解ThreadLocal

本文分析threadlocal的原理和使用 多執行緒訪問共享變數時容易出現併發問題,為了保證執行緒安全,一般會給共享變數進行適當的加鎖同步。如果不想加鎖呢?threadlocal可以做到執行緒隔離,多個執行緒訪問共享變數時,訪問的是自己執行緒的變數。threadlocal提供了執行緒本地變數,如果建...

ThreadLocal用法簡單示例

package com.learn.test author liuqi date 2020 3 4 23 23 desc 注 threadlocal和synchronized 相比前乙個以空間取代時間,每個訪問同乙個變數的執行緒都擁有該變數的乙個副本 後乙個以時間代替空間,多個執行緒訪問會進行排隊 ...