当前位置:网站首页>Simple understanding of ThreadLocal
Simple understanding of ThreadLocal
2022-07-03 06:08:00 【xuhss_ com】
High quality resource sharing
Learning route guidance ( Click unlock ) | Knowledge orientation | Crowd positioning |
---|---|---|
🧡 Python Actual wechat ordering applet 🧡 | Progressive class | This course is python flask+ Perfect combination of wechat applet , From the deployment of Tencent to the launch of the project , Create a full stack ordering system . |
Python Quantitative trading practice | beginner | Take you hand in hand to create an easy to expand 、 More secure 、 More efficient quantitative trading system |
Catalog * One 、 background
- Two 、ThreadLocal Problem solved
- 3、 ... and 、 How to create a ThreadLocal example
- Four 、ThreadLocal How to achieve thread variable isolation
- 5、 ... and 、ThreadLocalMap Medium hash How the conflict is handled
- 6、 ... and 、ThreadLocal Memory leak
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
Thread
Oneself , 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
ThreadLocal
A 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 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
,remove
Method , 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 Ofkey
Will be automatically recycled , However, its value will not be automatically recycled .
static class Entry extends WeakReference> {
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 classthreadLocals
Variable , 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
ThreadLocalMap
object . - towards
ThreadLocalMap
Set the value of ,key byThreadLocal
object , 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 .
边栏推荐
- 深入解析kubernetes controller-runtime
- Jedis source code analysis (I): jedis introduction, jedis module source code analysis
- SVN分支管理
- Installation du plug - in CAD et chargement automatique DLL, Arx
- CKA certification notes - CKA certification experience post
- Code generator - single table query crud - generator
- Oauth2.0 - using JWT to replace token and JWT content enhancement
- Es remote cluster configuration and cross cluster search
- Complete set of C language file operation functions (super detailed)
- Kubernetes notes (VI) kubernetes storage
猜你喜欢
Kubesphere - Multi tenant management
Apt update and apt upgrade commands - what is the difference?
[teacher Zhao Yuqiang] Cassandra foundation of NoSQL database
Kubernetes notes (IX) kubernetes application encapsulation and expansion
Kubernetes notes (I) kubernetes cluster architecture
伯努利分布,二项分布和泊松分布以及最大似然之间的关系(未完成)
Zhiniu stock -- 03
.NET程序配置文件操作(ini,cfg,config)
[teacher Zhao Yuqiang] use the catalog database of Oracle
Project summary --04
随机推荐
Code generator - single table query crud - generator
Jedis source code analysis (II): jediscluster module source code analysis
Es remote cluster configuration and cross cluster search
Synthetic keyword and NBAC mechanism
Kubesphere - Multi tenant management
SVN分支管理
Life is a process of continuous learning
arcgis创建postgre企业级数据库
Svn branch management
Alibaba cloud OOS file upload
Kubernetes notes (VII) kuberetes scheduling
Solve the problem of automatic disconnection of SecureCRT timeout connection
从小数据量分库分表 MySQL 合并迁移数据到 TiDB
[teacher Zhao Yuqiang] redis's slow query log
Detailed explanation of iptables (1): iptables concept
Solve the 1251 client does not support authentication protocol error of Navicat for MySQL connection MySQL 8.0.11
Analysis of Clickhouse mergetree principle
Oauth2.0 - using JWT to replace token and JWT content enhancement
pytorch 搭建神经网络最简版
Kubernetes notes (IV) kubernetes network