threadlocal是什麼?
當使用threadlocal修飾變數的時候,threadlocal會為每個使用該變數的執行緒提供獨立的變數副本,每個執行緒可以獨立改變自己的副本,而不
影響其他執行緒的變數副本。
相對於synchronized和lock實現對共享資源的操作互斥而實現原子性,這是一種新的思路解決併發問題。
原理:
publicclass thread implements
runnable
staticclass
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()原始碼:
publict get()
}return setinitialvalue();//
如果沒取到,進行初始化
}
getmap()原始碼:
threadlocalmap getmap(thread t)
setinitialvalue()原始碼:
privatet setinitialvalue()
set()原始碼:和前面一樣
publicvoid
set(t value)
remove()原始碼:
publicvoid
remove()
private
void remove(threadlocal<?>key)
}}
應用:
資料庫連線、session管理、使用者管理
publicclass
usercontext
public
static
user getuser()
}
下面兩段**來自:
publicstatic threadlocalconnectionholder = threadlocal.withinitial(() ->
catch
(sqlexception e)
return
conn;
});public
static
connection getconnection()
privatestatic
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...