当前位置:网站首页>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 .
边栏推荐
- Uniapp uni list item @click, uniapp uni list item jump with parameters
- (C语言)八进制转换十进制
- JZ63 股票的最大利润
- 分布式机器学习框架与高维实时推荐系统
- CDA data analysis -- Introduction and use of aarrr growth model
- SparkContext: Error initializing SparkContext解决方法
- LeetCode—剑指 Offer 37、38
- AI中台技术调研
- [old horse of industrial control] detailed explanation of Siemens PLC TCP protocol
- SVO2系列之深度滤波DepthFilter
猜你喜欢

Jenkins voucher management

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

Docker-compose配置Mysql,Redis,MongoDB

kubenetes中port、targetPort、nodePort、containerPort的区别与联系

ThreadLocal的简单理解
![[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

mysql索引和事务

二分刷题记录(洛谷题单)区间的甄别

Initial JDBC programming

Read the Flink source code and join Alibaba cloud Flink group..
随机推荐
初始JDBC 编程
LeetCode—<动态规划专项>剑指 Offer 19、49、60
Day12 control flow if switch while do While guessing numbers game
drools中then部分的写法
Deep understanding of NN in pytorch Embedding
浅谈sklearn中的数据预处理
记录一下MySql update会锁定哪些范围的数据
Leetcode122 the best time to buy and sell stocks II
ORB-SLAM2不同线程间的数据共享与传递
arcgis js 4.x 地图中加入图片
子线程获取Request
Heap (priority queue)
分布式机器学习框架与高维实时推荐系统
自然语言处理系列(二)——使用RNN搭建字符级语言模型
ThreadLocal的简单理解
Time format display
Small guide for rapid formation of manipulator (VII): description method of position and posture of manipulator
Map and set
Mysql database foundation
JZ63 股票的最大利润