繁体   English   中英

java ThreadLocal proplem

[英]java ThreadLocal proplem

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;
    }

案例1是正确的。

但案例2

  1. 第一个tomcat请求..
  2. 第二个请求可能会获得属于第一个req的WebContext对象。
  3. 当第2步发生时,WebContext的请求对象已经禁用了。
  4. 然后在操作wc和请求对象时发生问题!

问题是:

  1. Thread上的一个ThreadLocal绑定不对吗?
  2. 是一个tomcat请求是一个线程不对吗?
  3. 上面的代码有多正确?

ps:对不起,我的英语不好。 :)

  1. Thread上的一个ThreadLocal绑定不对吗?

ThreadLocal将单独的对象绑定到每个线程,是的。 这是它的目的。

  1. 是一个tomcat请求是一个线程不对吗?

每个请求都由一个线程处理,但我相当确定Tomcat不会为每个请求生成一个新线程。 它使用线程池。

此外,同一会话中的不同请求可以由不同的线程服务。

  1. 上面的代码有多正确?

如果以前的答案没有解释,那么我不知道,因为你不清楚你认为你认为不正确的行为的方式。

然而,如果你的意图是每个请求只有一个WebContext ,它是唯一的,那么ThreadLocal似乎是管理它的糟糕选择。 另一方面,请求属性是为了这个目的而设计的。 请参阅ServletRequest.getAttribute()ServletRequest.setAttribute()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM