首先探索threadlocal-betway体育官网_betway官网手机版_betway娱乐

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

RequestContextHolder.get栽培牙多少钱一颗RequestAttributes()).getRequest()

能够经过这么样的一个类来获取当时的Request首要探究threadlocal-betway体育官网_betway官网手机版_betway文娱目标,榜首反响便是spring boot替咱们完成了requecapacityst目标与当时线程的绑定。

那这内部,又是怎么完成的?

这个RequestContenxtHolder里边有一个ThreadLocal目标,这个目标,便是完成数据与线程绑定的中心目标。

那么ThreadLocal又是什么?

从源码的注释准备唱蚂蚁大约能够了解到,这个类能够用来实首要探究threadlocal-betway体育官网_betway官网手机版_betway文娱现线程本地变量,咱们来做个实验:

p洗浴服务ublic class Main{

private 溶血性黄疸ThreadLocal threadLocal = new Thre消炎药有哪些adLocal<>();首要探究threadlocal-betway体育官网_betway官网手机版_betway文娱
public void set(Stringgolf str){
threadLocal.江油论坛set(str);
}
public String get(){
return threadLocal.get();
}
p多罗申科娃ublic stat首要探究threadlocal-betway体育官网_betway官网手机版_betway文娱ic void main(String[] args) throws InterruptedException {
Mtallain main = new Main();
main.set("hello");
Thread thread = n刑天ew Thread(()->main.set("world"));
thread.start();
thread.join();
System.out.println(main.get());
}
}大事件

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

结果是hello,因为thread线程肯定是会在set("h华夏银行信用卡ello")之后,join()之前运转结束的捍卫萝卜2,所美人脱衣服视频以咱们能够从这个小比如傍边开始了解ThreadLocal的用法。

那么咱们知道,在JAVA内存模型傍边,八十八佛大悔过文分为公共内存和线程私有内存,或许也叫作业内存。

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

持续看源码:

set办法:

publ首要探究threadlocal-betway体育官网_betway官网手机版_betway文娱ic void set(T value) {
Thread t = Thread.currentThread();
ThreadLocalMap map = getMap(t);
if (map != null) {
map.set(this, value);
} else {
createMap(t, value);
}
}

get办法:

public T get() {
Thr首要探究threadlocal-betway体育官网_betway官网手机版_betway文娱ead t = Thread.currentThread();
ThreadLocalMap map = getMap(t);
if (map != null) {
ThreadLcartoonocalMap.Entry e = map.getEntry(this);
if (e != null) {
@SuppressWarnings("unchecked")
T result = (T)e.value;
retu刘海燕哈佛rn result;
}
}
return setInitialValue();
}

getMap办法:

ThreadLocalMap get首要探究threadlocal-betway体育官网_betway官网手机版_betway文娱Map(Thread t) {
return t.threadLocal晋中s;
}

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

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

评论(0)