gpt4 book ai didi

java - RequestContextHolder 是线程安全的吗?

转载 作者:行者123 更新时间:2023-11-29 09:52:29 27 4
gpt4 key购买 nike

在我的 Spring JDBC 项目中,我有一个名为 DBStuff 的类,我用它来连接到数据库并进行简单的数据库操作。是web项目,有用户,自然是用session机制。当我需要在 DBStuff 类中检索请求数据时,我使用下面这行代码:

HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();

但是,没有解释 RequestContextHolder 是否是线程安全的。连春官forum没有答案。由于使用了 servlet,我需要为用户提供线程安全的特性。

根据定义,RequestContextHolder 被定义为“以线程绑定(bind) RequestAttributes 对象的形式公开 Web 请求的 Holder 类。”但我不确定“线程绑定(bind)”是否代表线程安全。

最佳答案

“线程绑定(bind)”意味着每个线程都有自己的数据副本,因此是线程安全的。

它为此使用了ThreadLocal

private static final ThreadLocal<RequestAttributes> requestAttributesHolder = 
new NamedThreadLocal<RequestAttributes>("Request attributes");

public static RequestAttributes getRequestAttributes() {
RequestAttributes attributes = requestAttributesHolder.get();
if (attributes == null) {
attributes = inheritableRequestAttributesHolder.get();
}
return attributes;
}

requestAttributesHolder.get() 为当前线程返回RequestAttributes,它是一个处理HTTP请求的线程。每个请求都有自己的线程。

ThreadLocal 的方法get() 使用映射将数据绑定(bind)到Thread.currentThread()

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

When and how should I use a ThreadLocal variable?

关于java - RequestContextHolder 是线程安全的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36933224/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com