2012-08-09 73 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