当前位置:网站首页>Simple understanding of ThreadLocal
Simple understanding of ThreadLocal
2022-07-02 12:14:00 【huan_ one thousand nine hundred and ninety-three】
List of articles
One 、 background
Recently someone asked me ThreadLocal How to make the values in each thread isolated , Write an article here to briefly record .
Two 、ThreadLocal Problem solved
- The data belongs to the thread
ThreadOneself , Other threads cannot affect it .( We need to pay attention to : Need to call ThreadLocal Of remove Method ) - There is no thread safety issue .( because
ThreadLocalA variable of type can only be accessed by its own thread , So this is true .)
such as :
After the user logs in successfully , Need to put Login user information Save up , So that you can use... Anywhere in the system , Then you can use ThreadLocal To achieve . for example :Spring Security Medium ThreadLocalSecurityContextHolderStrategy class .
3、 ... and 、 How to create a ThreadLocal example
private static final ThreadLocal<String> USER_NAME = new ThreadLocal<>();
ThreadLocal For example, it is recommended to use private static final To modify .
Four 、ThreadLocal How to achieve thread variable isolation
1、 understand 3 Classes
ThreadLocal: This class provides a simpleset,get,removeMethod , Used for setting up , Get or remove Bound to the value in the thread local variable .ThreadLocalMap: This is ThreadLocal A class defined in , It can be simply understood as a Map, But its key yes WeakReference Weak reference type , So when the value is not referenced elsewhere , In case of garbage collection , This map OfkeyWill be automatically recycled , However, its value will not be automatically recycled .static class Entry extends WeakReference<ThreadLocal<?>> { Object value; Entry(ThreadLocal<?> k, Object v) { // key Weak reference super(k); // Value strong reference value = v; } }Thread: This is the thread class , There is a in this classthreadLocalsVariable , The specific type isThreadLocal.ThreadLocalMap.
2、 look down set How are methods implemented
public void set(T value) {
// Get the current thread
Thread t = Thread.currentThread();
// Get the... Bound to the thread itself ThreadLocalMap, This ThreadLocalMap It's from Thread Class `threadLocals` Variable
ThreadLocalMap map = getMap(t);
if (map != null) {
// towards map Set the value of ,key by ThreadLocal Instance of object .
map.set(this, value);
} else {
// If map non-existent , Then create .
createMap(t, value);
}
}
Through the code above , We know : When we turn to ThreadLocal Set a value in the , It will go through the following steps :
- Get the current thread
Thread - Gets the current thread's
ThreadLocalMapobject . - towards
ThreadLocalMapSet the value of ,key byThreadLocalobject , The value is a specific value .
3、 have a look get How to achieve
public T get() {
// Get the current thread
Thread t = Thread.currentThread();
// Get the binding of the thread itself ThreadLocalMap object
ThreadLocalMap map = getMap(t);
if (map != null) {
// this yes ThreadLocal object , obtain Map Medium Entry object
ThreadLocalMap.Entry e = map.getEntry(this);
if (e != null) {
@SuppressWarnings("unchecked")
// Get specific values
T result = (T)e.value;
return result;
}
}
// Set initial value
return setInitialValue();
}
From above get and set The way to know , Through to ThreadLocal Object to set or get a value , In fact, it is the final operation to Thread Object threadLocals Field , And this field is Thread Self , Therefore, isolation is achieved .
5、 ... and 、ThreadLocalMap Medium hash How the conflict is handled
1、ThreadLocal Object's hash What is the value
private final int threadLocalHashCode = nextHashCode();
// The ThreadLocal Of the object itself hash code value
private final int threadLocalHashCode = nextHashCode();
// from 0 Start
private static AtomicInteger nextHashCode = new AtomicInteger();
// Increment a fixed value each time
private static final int HASH_INCREMENT = 0x61c88647;
// hash code Value calculation
private static int nextHashCode() {
return nextHashCode.getAndAdd(HASH_INCREMENT);
}
From the code above, you can ,ThreadLocal Class after instantiation , its hash code value (threadLocalHashCode) It's fixed , Even if ThreadLocal Called set Method , Other values are set , its hash code value It won't change .
This field threadLocalHashCode by ThreadLocal Object's hash value , stay ThreadLocalMap This is needed in hash value .
2、 solve hash Conflict

ThreadLocalMap solve hash The solution to conflict is simple . Is through linear detection . If there is a conflict , Just look for the available position behind the array . See the picture above for details . The demonstration is A and B 2 individual ThreadLocal object , Then there was a conflict ,A and B The location of existence is in that place .
6、 ... and 、ThreadLocal Memory leak
ThreadLocal Why is there a memory leak ?
This is because ThreadLocalMap Medium key yes WeakReference type , That is, weak reference types , Data with weak reference type has no external strong reference type , In the event of a gc When , Will be automatically recycled . Be careful : Now it's key It's recycled , however value There is no recycling . So in ThreadLocalMap Medium Entry[] There may be key yes null, however value Is an object of concrete value , So there is a memory leak .
Fix memory leaks :
When we're done ThreadLocal After the object , Need to call... At the right time ThreadLocal#remove() Method . Otherwise, we have to wait Thread Auto exit to clear , If the thread pool is used ,Thread Reuse , The opportunity to clear is even more difficult .
边栏推荐
猜你喜欢

基于Arduino和ESP8266的Blink代码运行成功(包含错误分析)

【工控老马】西门子PLC Siemens PLC TCP协议详解

自然语言处理系列(三)——LSTM

From scratch, develop a web office suite (3): mouse events

Small guide for rapid formation of manipulator (VII): description method of position and posture of manipulator

mysql表的增删改查(进阶)

CDH存在隐患 : 该角色的进程使用的交换内存为xx兆字节。警告阈值:200字节

YYGH-BUG-04

Tas (file d'attente prioritaire)
![[geek challenge 2019] upload](/img/04/731323142161a4994c14fedae38b81.jpg)
[geek challenge 2019] upload
随机推荐
Small guide for rapid formation of manipulator (VII): description method of position and posture of manipulator
【C语言】杨辉三角,自定义三角的行数
(C language) input a line of characters and count the number of English letters, spaces, numbers and other characters.
史上最易懂的f-string教程,收藏这一篇就够了
Larvel modify table fields
mysql数据库基础
Heap (priority queue)
Time format display
SVO2系列之深度滤波DepthFilter
LeetCode—剑指 Offer 37、38
Docker-compose配置Mysql,Redis,MongoDB
Repeat, tile and repeat in pytorch_ The difference between interleave
PyTorch nn.RNN 参数全解析
ThreadLocal的简单理解
CDA data analysis -- common knowledge points induction of Excel data processing
寻找二叉树中任意两个数的公共祖先
排序---
高性能纠删码编码
Applet link generation
刷题---二叉树--2