我最近在技术测试中被问到这个问题,并且一直想知道什么是一个好的答案,以防它再次出现。
基本上,考虑到在JSP中发现了几个竞争条件的场景(由于广泛使用了实例变量和scriptlet代码),在不重写代码的情况下解决并发问题的好方法是什么? / p>
我回答说:利用Spring bean来访问实例变量,以避免在访问变量时创建多个对象(因为默认情况下,Spring bean在设计中是单例)。我很想听到其他的解释或答案。
答案 0 :(得分:0)
首次请求JSP或Web应用程序启动时,servlet容器会将其编译为扩展HttpServlet
的类,并在Web应用程序的生命周期内使用它(source)
JSP具有页面指令属性。您可以在specification
中查看具体来说,您可以在页面上更改一个属性:
<%@ page isThreadSafe="false" %>
此属性指示页面中实现的线程安全级别。
false
,那么JSP容器将派遣多个未完成的
客户端请求,按照收到的顺序,一次一个
用于处理的页面实现。 true
,则JSP容器可以选择同时向页面分派多个未完成的客户端请求。使用true
的页面作者必须确保它们正确无误
同步访问页面的共享状态。
默认值为true
。
请注意,即使isThreadSafe
属性为false
JSP
页面作者必须确保访问任何共享对象
正确同步。可以共享对象
ServletContext
或HttpSession
。
因此,如果将isThreadSafe
属性设置为false
(因此生成的servlet应该实现SingleThreadModel
),并确保您的scriplet不使用共享的对象无论是ServletContext
还是HttpSession
,它都可能是解决并发问题的好方法。