簡體   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