Java ServletContext属性:线程安全测试不工作
我试图检查servletContext属性的线程安全性。我知道ServletContext属性在整个Web应用程序中都是可用的,任何人都可以访问和修改,因此我尝试测试负面as场景(即,上下文属性由某人设置,由他人更新),但它不起作用 添加实际代码的代码段 Servlet AJava ServletContext属性:线程安全测试不工作,java,jsp,servlets,Java,Jsp,Servlets,我试图检查servletContext属性的线程安全性。我知道ServletContext属性在整个Web应用程序中都是可用的,任何人都可以访问和修改,因此我尝试测试负面as场景(即,上下文属性由某人设置,由他人更新),但它不起作用 添加实际代码的代码段 Servlet A public class TestContextAttributeThreadSafety extends HttpServlet { protected void processRequest(HttpServletRe
public class TestContextAttributeThreadSafety extends HttpServlet {
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//synchronized(getServletContext()){
getServletContext().setAttribute("safety", "SetByThreadA");
//}
RequestDispatcher view = request.getRequestDispatcher("threadSafetyJsp.jsp");
view.forward(request, response);
}
Servlet B
public class TestContextAttributeThreadSafetyB extends HttpServlet {
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
//synchronized(getServletContext()){
getServletContext().setAttribute("safety", "SetByThreadB");
//}
RequestDispatcher view = request.getRequestDispatcher("threadSafetyJsp.jsp");
view.forward(request, response);
}
Index.html
<form name =" testThreadSafetyA" method ="GET" action="./TestContextAttr">
<br><br>
<h3> Test Context Attribute Thread Safety A</h3>
<input type="SUBMIT" value ="submit">
</form>
<form name =" testThreadSafetyB" method ="GET" action="./TestContextAttrB">
<br><br>
<h3> Test Context Attribute Thread Safety B</h3>
<input type="SUBMIT" value ="submit">
</form>
</body>
测试上下文属性线程安全性A
测试上下文属性线程安全性B
weB.XML
<servlet>
<servlet-name>/TestContextAttribute</servlet-name>
<servlet-class>com.incredible.controller.TestContextAttributeThreadSafety</servlet-class>
</servlet>
<servlet>
<servlet-name>TestContextAttributeB</servlet-name>
<servlet-class>com.incredible.controller.TestContextAttributeThreadSafetyB</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>/TestContextAttribute</servlet-name>
<url-pattern>/TestContextAttr</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>TestContextAttributeB</servlet-name>
<url-pattern>/TestContextAttrB</url-pattern>
</servlet-mapping>
/TestContextAttribute
com.cn.controller.TestContextAttributeThreadSafety
TestContextAttributeB
com.cn.controller.TestContextAttributeThreadSafetyB
/TestContextAttribute
/TestContextAttr
TestContextAttributeB
/TestContextAttrB
threadSafetyJsp.jsp
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>JSP Page</title>
</head>
<body>
<h1>Thread Safety Test : </h1>
<%out.print(getServletContext().getAttribute("safety"));%>
</body>
</html>
JSP页面
螺纹安全测试:
现在我在两个不同的浏览器中运行这个应用程序。在一个浏览器中,我单击第一个提交按钮以获得输出SetByThreadA,在另一个浏览器中,我单击第二个提交按钮,该按钮提供输出SetByThreadB
现在,单击第二个提交按钮后,ServletContext属性安全性由ThreadB更新。所以,我回到ThreadA输出的第一个浏览器(即SetByThreadA),然后单击页面刷新按钮。由于它将再次加载jSP页面,这将获取ServletContext属性安全性的值,因此我希望第一个浏览器上的ServletContext的更新值,即SetByThreadB。但是,它仍然显示出挫折READA。所以,我不明白为什么这个值没有得到更新。请帮忙
我试图检查servletContext属性的线程安全性
不,你不是。你没有在这里测试线程安全之类的东西。您只需按顺序测试setAttribute()
。无法保证这两段代码不会在同一个线程上执行。这是毫无意义的。它是有效的,如果它不起作用,你就无能为力
不要测试平台。我们怎么能?你没有发布任何代码。我已经添加了我正在做的全部描述。和主要代码点。这还不够吗?另外,代码在另一个上machine@JBNizet,我已经添加了代码片段,请立即回答。刷新页面将向./TestContextAttr发送相同的GET请求,从而调用TestContextAttributeThreadSafety servlet,该servlet将再次将servlet上下文属性设置为“SetByThreadA”,然后转发到JSP,将显示其新值:“SetByThreadA”。您需要将请求发送到第三个servlet(或直接发送到JSP),该servlet只显示上下文属性,并且在显示它之前不进行设置。@jbnize,我可以通过将请求传递给第一个ServletA/ServletB-->result.JSP-->ThreadSafetyResult.JSP来获得预期结果,在这里我得到了servletContext属性,当我第二次刷新页面时,它更新了结果。现在,为了使用“synchronized”块解决这个问题,我将setAttribute()放在该块中并再次测试,但它没有解决问题。你能建议一些方法来测试整个行为吗?想法是检查同步块的需要。由于此属性可以从应用程序中的任何位置和任何servlet/线程读取,因此任何人都可以对其进行更新。所以,如果你有任何解决方案,我可以用它来产生这个场景,然后我可以用同步块来解决它,请告诉我这个问题可以解析地回答。你不需要测试它。保存上下文属性的映射是否线程安全?Servlet规范提供了答案。你这样做完全是错误的。如果您首先参考了规范,您已经得到了答案。我正在学习servlet,正如我所了解的,这些属性不是线程安全的,如果我设置了属性,其他servlet或请求或任何有权访问servlet上下文的人都可以更新这些属性。因此,建议的解决方案是在更新属性时使用“synchronized”块,这将防止这种情况发生。所以,我想测试这个场景,以确保存在问题,并将属性放入snychronized块中。这就是我正在努力解决的问题,如何创建问题,然后使用synchronized block解决它:)它不会阻止它的发生。这会拖延时间。如果更新属性,它将得到更新。这就是它的目的。获取更新。这里的某个地方有一个严重的误会。在任何情况下,你都不是在测试你认为你在测试的东西。真正的问题是为什么要使用Servlet上下文属性,并试图使它们成为线程安全的。他们不是。不可能。它们是应用范围的。也许您应该使用请求范围的属性。