2012-08-09 74 views
1

在這link,我看到下面的代碼。PageContext線程共享

synchronized (_jspx_page_context) { 
    pageCounter = (jspexamples.counterBean) _jspx_page_context.getAttribute("pageCounter", PageContext.PAGE_SCOPE); 
    if (pageCounter == null){ 
     pageCounter = new jspexamples.counterBean(); 
     _jspx_page_context.setAttribute("pageCounter", pageCounter, PageContext.PAGE_SCOPE); 
    } 
} 

其中_jspx_page_context的類型爲PageContext。爲什麼在_jspx_page_context上有同步? PageContext是否是線程共享的?

+0

你能發佈生成該代碼的實際JSP嗎? PageContext對象不在線程之間共享,所以代碼片段對我來說並不合適。 – pap 2012-08-09 07:13:28

+0

它可以[在這裏](http://cs.gmu.edu/~offutt/classes/432/examples/jsp/counterScope.txt)。我在tomcat repo中也發現了類似的例子。 – user1539577 2012-08-09 07:28:58

回答

2

它是線程共享,意味着多個線程可以在任何時候訪問pagecontext。因此,爲確保線程安全,我們必須在pageContext上執行synchronize操作。否則,多個線程可能會更新相同的值,並且結果將被修復。

+0

如果你看看這個[鏈接](http://www.exampledepot.com/egs/javax.servlet.jsp/attr.html),在我看來,當範圍是PageContext.PAGE_SCOPE或PageContext.REQUEST_SCOPE時, *絕對*無法同時訪問兩個線程。 我不太清楚其他範圍以及多個線程如何導致有問題的行爲。 – user1539577 2012-08-09 05:48:47

+0

如果範圍是PAGE/REQUEST,兩個線程無法訪問,是什麼讓你覺得呢?假設你有一個Ajax應用程序,每次點擊觸發一個Ajax調用,是不是說Ajax調用單獨的線程? – kosa 2012-08-09 06:16:22

+0

@thinksteep你是不正確的。 PageContext對象不在線程之間共享。它們或者爲每個請求創建,或者根據servlet引擎,它們可以在線程上下文的基礎上彙集(即不在線程之間共享)。 – pap 2012-08-09 07:11:43