併發和多執行緒 十二 ThreadLocal

2022-02-18 21:38:47 字數 2674 閱讀 2745

threadlocal是什麼?

當使用threadlocal修飾變數的時候,threadlocal會為每個使用該變數的執行緒提供獨立的變數副本,每個執行緒可以獨立改變自己的副本,而不

影響其他執行緒的變數副本。

相對於synchronized和lock實現對共享資源的操作互斥而實現原子性,這是一種新的思路解決併發問題。

原理:

public

class thread implements

runnable

static

class

threadlocalmap

}private

static

final

int initial_capacity = 16;

private

entry table;

private

int size = 0;

private

int threshold; //

default to 0

private

void setthreshold(int

len)

private

static

int nextindex(int i, int

len)

private

static

int previndex(int i, int

len)

}

threadlocalmap:

threadlocal的內部類,類似hashmap結構,以threadlocal為key,

需要隔離的資料為value的entry鍵值對陣列結構。

entry繼承了weakreferences,只要發生gc,

key為null的entry就會被清理掉

get()原始碼:

public

t get()

}return setinitialvalue();//

如果沒取到,進行初始化

}

getmap()原始碼:

threadlocalmap getmap(thread t)

setinitialvalue()原始碼:

private

t setinitialvalue()

set()原始碼:和前面一樣

public

void

set(t value)

remove()原始碼:

public

void

remove()

private

void remove(threadlocal<?>key)

}}

應用:

資料庫連線、session管理、使用者管理

public

class

usercontext

public

static

user getuser()

}

下面兩段**來自:

public

static threadlocalconnectionholder = threadlocal.withinitial(() ->

catch

(sqlexception e)

return

conn;

});public

static

connection getconnection()

private

static

final threadlocal threadsession = new

threadlocal();

public

static session getsession() throws

infrastructureexception

} catch

(hibernateexception ex)

return

s;}

與thread同步機制的比較:

threadlocal:用於執行緒間的資料隔離,適用於多例項物件的訪問,並且這個物件很多地方都要用到

synchronized:用於執行緒間的資料共享

spring中的應用:

只有無狀態的bean才可以在多執行緒環境下共享,在spring中,

絕大部分bean都可以宣告為singleton作用域。就是因為spring對一些bean(

如requestcontextholder、

transactionsynchronizationmanager、

localecontextholder等)中非執行緒安全狀態採用threadlocal進行處理,讓

它們也成為執行緒安全的狀態,

因為有狀態的bean就可以在多執行緒中共享了。

併發和多執行緒

併發 concurrency 某段時間內,多個任務被cpu交替處理。並行 parallelism cpu同時處理多個任務。併發打破和程式的封閉性,具有以下挑戰 1 併發程式之間有相互制約 對資源的爭搶和彼此的依賴 的關係。2 併發執行緒執行過程不連貫 斷斷續續,需要儲存和切換現場。3 設計合理的併發...

十二多執行緒

訊號驅動i 0是指程序預先告知核心,使得當某個描述字上發生某事時,核心使用訊號通知相關程序。非同步i 0是程序執行i 0系統呼叫 比如讀或者寫 核心啟動i 0操作後立刻返回程序,程序可以在i 0操作執行期間繼續處理別的事情,然後當i 0操作成功或者失敗時,核心以程序預先設定的方式通知程序。多個執行緒...

高併發和多執行緒

高併發和多執行緒 總是被一起提起,給人感覺兩者好像相等,實則高併發 多執行緒 多執行緒是完成任務的一種方法,高併發是系統執行的一種狀態,通過多執行緒有助於系統承受高併發狀態的實現。高併發是一種系統執行過程中遇到的一種 短時間內遇到大量操作請求 的情況,主要發生在web系統集中大量訪問或者socket...