解决JSP中的并发问题

时间:2017-12-25 10:34:27

标签: java spring jsp

我最近在技术测试中被问到这个问题,并且一直想知道什么是一个好的答案,以防它再次出现。

基本上,考虑到在JSP中发现了几个竞争条件的场景(由于广泛使用了实例变量和scriptlet代码),在不重写代码的情况下解决并发问题的好方法是什么? / p>

我回答说:利用Spring bean来访问实例变量,以避免在访问变量时创建多个对象(因为默认情况下,Spring bean在设计中是单例)。我很想听到其他的解释或答案。

1 个答案:

答案 0 :(得分:0)

首次请求JSP或Web应用程序启动时,servlet容器会将其编译为扩展HttpServlet的类,并在Web应用程序的生命周期内使用它(source

JSP具有页面指令属性。您可以在specification

中查看

具体来说,您可以在页面上更改一个属性:

<%@ page isThreadSafe="false" %>

此属性指示页面中实现的线程安全级别。

  • 如果false,那么JSP容器将派遣多个未完成的 客户端请求,按照收到的顺序,一次一个 用于处理的页面实现。
  • 如果true,则JSP容器可以选择同时向页面分派多个未完成的客户端请求。

使用true的页面作者必须确保它们正确无误 同步访问页面的共享状态。 默认值为true。 请注意,即使isThreadSafe属性为false JSP 页面作者必须确保访问任何共享对象 正确同步。可以共享对象 ServletContextHttpSession

因此,如果将isThreadSafe属性设置为false(因此生成的servlet应该实现SingleThreadModel),并确保您的scriplet不使用共享的对象无论是ServletContext还是HttpSession,它都可能是解决并发问题的好方法。