当前位置:网站首页>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 .
边栏推荐
猜你喜欢

Go学习笔记—多线程

Docker-compose配置Mysql,Redis,MongoDB
![[old horse of industrial control] detailed explanation of Siemens PLC TCP protocol](/img/13/9002244555ebe8a61660c2506993fa.png)
[old horse of industrial control] detailed explanation of Siemens PLC TCP protocol

深入理解PyTorch中的nn.Embedding

MySQL and PostgreSQL methods to grab slow SQL

The differences and relationships among port, targetport, nodeport and containerport in kubenetes

深入理解P-R曲线、ROC与AUC

Test shift left and right

Applet link generation
![[C language] convert decimal numbers to binary numbers](/img/9b/1848b68b95d98389ed985c83f2e856.png)
[C language] convert decimal numbers to binary numbers
随机推荐
Leetcode922 sort array by parity II
【C语言】十进制数转换成二进制数
kubenetes中port、targetPort、nodePort、containerPort的区别与联系
kubeadm join时出现错误:[ERROR Port-10250]: Port 10250 is in use [ERROR FileAvailable--etc-kubernetes-pki
Go learning notes - multithreading
jenkins 凭证管理
Read the Flink source code and join Alibaba cloud Flink group..
Sparkcontext: error initializing sparkcontext solution
深入理解PyTorch中的nn.Embedding
(C language) 3 small Codes: 1+2+3+ · · +100=? And judge whether a year is a leap year or a normal year? And calculate the circumference and area of the circle?
分布式机器学习框架与高维实时推荐系统
The differences and relationships among port, targetport, nodeport and containerport in kubenetes
From scratch, develop a web office suite (3): mouse events
Take you ten days to easily finish the finale of go micro services (distributed transactions)
lombok常用注解
求16以内正整数的阶乘,也就是n的阶层(0=<n<=16)。输入1111退出。
Uniapp uni list item @click, uniapp uni list item jump with parameters
SVO2系列之深度濾波DepthFilter
使用Sqoop把ADS层数据导出到MySQL
Gaode map test case