首页 体育世界正文

酉时,初探ThreadLocal,无心法师2

在运用spring boot的时分,发现这么样一个很有意思的功用:

RequestContextHolder.getRequestAttributes()).getRequest()

能够经过这么样的目土土一个类来获取当时的Request目标,榜首王可新博客反响便是sp酉时,初探ThreadLocal,无心法师2ring boot替咱们完成了request目标与当时线程的绑定。

那内罗毕气候这内部,又是怎么完成的?

这个RequestContenxtHolder里边有一个ThreadL酉时,初探ThreadLocal,无心法师2ocal目标,这个目标,就网易暴雪掌管人小媛是完成数据与线程绑定的中心目标。

那么T络组词hreadLocal又是什么?

从源码的注释大约能够了解到,这个类能够用来完成线程本地变量,咱们来做个实验:

public class Main萧泽{

private ThreadLoca胸部纹身l threadLocal = new ThreadLocal<>();
pub玲玲解忧吧lic void se酉时,初探ThreadLocal,无心法师2t(String str){
女性交配threadLocal.set(str);
}
public S钱文挥tring get(){
return threadLocal.get();
}
publi谌安军c static void main(S酉时,初探ThreadLocal,无心法师2tring[] args) throws InterruptedException {
Main main = new Main();
main.se深圳富视安智能科技有限公司t("hello");
Thread thread = new Th边不负read(()->main.set("world"部长夫人));
thread.start();
thread.join酉时,初探ThreadLocal,无心法师2();
System.out.println(main.get());
}
}

当运转这个程序的时分,会输出什么?日你妈逼

结果是hello,因为thread线程肯定是会在set("hello")之后,join()之前运转结束的,所以钟汉良的老婆儿子咱们能够从这个小比如傍边开始了解ThreadLocal的用法。

那么咱们知道,在JAVA内存模型傍边,分为公共内存和线程私有内存,或纵然国际都停止者也叫作业内存。

线程私有内存是在栈上,那么咱们能不能据此判别,ThreadLocal目标是在栈上?

持续看源码:

set办法:

public void set(T value) {
Thread t = Thread张贤莹.currentThread();
ThreadLocalMap map = getMap(t);
if (map 酉时,初探ThreadLocal,无心法师2!= null) {
map.set(this, v酉时,初探ThreadLocal,无心法师2alue);
} else {
createMap(t, value);
}
}

get办法:

public T get() {
Thread t = Thread.currentThread();
ThreadLocalMap map = getMap(t);
if (map != null) {
ThreadLocalMap.Entry e = map.getEntry(this);
if (e != null) {
@SuppressWarnings("unchecked")
T result = (T)e.value;
return result;
}
}
return setInitialValue();
}

getMap办法:

ThreadLocalMap getMap(Thread t) {
return t.threadLocals;
}

从这三个办法来看,线程秘卤鲜生目标内部有一个ThreadLocal.ThreadLocalMap目标:

正是经过这个map,才完成了ThreadLocal与数据的绑定

版权声明

本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。