作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在我的 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();
}
关于java - RequestContextHolder 是线程安全的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36933224/
我是一名优秀的程序员,十分优秀!