java ThreadLocal proplem

原创 2016年12月22日 11:11:07
private HttpServletRequest request;
private static ThreadLocal<WebContext> wcHolder = new ThreadLocal<WebContext>();
    private WebContext(){}

    public static WebContext newInstance(HttpServletRequest request){
//case 1:correct
//        WebContext wc = new WebContext();
//        wc.request = request;

//case 2:incorrect
//(to resolve multiply creat WebContext object within one request)
        WebContext wc = wcHolder.get();
        if(wc==null){
            wc = new WebContext();
            wc.request = request;
            wcHolder.set(wc);
        }
        return wc;
    }

case 1 is correct.

but case 2

first tomcat request..
second request may get the WebContext object which belong to first req.
when step 2 happened,WebContext’s request object had diabled.
then problem happened when operate on the wc and the request object!
the question is:

is one ThreadLocal bind on Thread not right?
is one tomcat request is one Thread not right?
how correct above code ?
ps:sorry,my english is bad. :)

comment

Seeing code that captures a reference to an HttpServletRequest leads me to believe that, very soon, you will be posting a question about why your application is behaving strangely, usually confusing a response for one request as another. Be very careful when capturing a reference to a request object somewhere like a ThreadLocal. – Christopher Schultz 3 hours ago

yes,you are right.the problem had happened ,when refresh page repeatly,because get previous request obj by threadLocal.get(). i guess tomcat just assign the same thread for the repeatly browser request that moment.then app throw nullpoint error,i invoke request.getSession().getAtt.. – wangshao 2 hours ago

thanks@John Bollinger,@Christopher Schultz.now the problem had resolved. invoke WebContext.reset(),then method do ThreadLocal.remove(), within spring interceptor.preHandle method.ps thanks more patient for my bad english.i am try better.:) – wangshao 2 hours ago

ANSWER

is one ThreadLocal bind on Thread not right?
A ThreadLocal binds a separate object to each thread, yes. That’s its purpose.

is one tomcat request is one Thread not right?
Each request is handled by exactly one thread, but I’m fairly certain that Tomcat does not spawn a new thread for each request. It uses a thread pool.

Also, different requests in the same session may be served by different threads.

how correct above code ?
If the previous answers don’t explain it then I don’t know, because it’s not clear in what way you consider the behavior you observe to be incorrect.

Nevertheless, if your intent is for each request to have exactly one WebContext, unique to it, then ThreadLocals seem a poor choice for managing that. Request attributes, on the other hand, are designed for exactly that purpose. See ServletRequest.getAttribute(), ServletRequest.setAttribute(), etc..

参考资料

stack overflow跳点

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

深入研究java.lang.ThreadLocal类

一、概述   ThreadLocal是什么呢?其实ThreadLocal并非是一个线程的本地实现版本,它并不是一个Thread,而是threadlocalvariable(线程局部变量)。...

java事务 - threadlocal

  • 2014-09-13 12:46
  • 1.07MB
  • 下载

JAVA ThreadLocal类深入

  • 2011-07-31 10:20
  • 46KB
  • 下载

深入研究java.lang.ThreadLocal类

深入研究java.lang.ThreadLocal类     一、概述   ThreadLocal是什么呢?其实ThreadLocal并非是一个线程的本地实现版本,它并不...

Java并发之ThreadLocal

在Java中,对象是线程共享的,当我们想让线程独自拥有专属于自己的变量时,可以使用ThreadLocal类。     ThreadLocal类提供了线程局部(Thread-Locak)变量。这些变量...

Java 多线程:ThreadLocal 多线程同步关键字

包括: 一. 什么是 ThreadLocal 二. ThreadLocal 类中的方法简介 三. 如何使用ThreadLocal      3.1 3个线程共享一个对象,各自产生序列号   ...

java threadlocal

首先,ThreadLocal不是用来解决共享对象的多线程访问问题的,一般情况下,通过ThreadLocal.set()到线程中的对象是该线程自己使用的对象,其他线程是不需要访问的,也访问不到的。各个线...

Java高级编程:深入剖析ThreadLocal

以下是本文目录大纲:   一.对ThreadLocal的理解   二.深入解析ThreadLocal类   三.ThreadLocal的应用场景        四.总结   一. 对ThreadLoc...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)