深入研究Servlet线程安全性问题
2018-02-03 22:26
239 查看
Servlet实例,是由Servlet引擎实例化的,一般只会实例化一个实例来处理不同用户的请求(一个用户一个线程),如Tomcat..
但不同用户访问一个Servlet实例时,如果此实例有实例成员变量,就会有并发性的问题,因为JMM模型中,实例变量是存储在堆空间的,而堆空间是线程共享的。
所有,同一Servlet实例在不同线程中,实例变量是共享的,就有被不同用户线程同时访问。
public class ConcurrentTest extends HttpServlet {
PrintWriteroutput; //此实例成员,会在不同线程中共享
@Override
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String username;
response.setContentType("text/html;charset=gb2312");
username=request.getParameter("username");
output=response.getWriter();
try {
//为了突出并发问题,在这设置一个延时
Thread.sleep(5000);
output.println("用户名:"+username+"<BR>");
} catch (Exception e) {
e.printStackTrace();
}
}
}
https://www.cnblogs.com/gw811/archive/2012/09/07/2674859.html
但不同用户访问一个Servlet实例时,如果此实例有实例成员变量,就会有并发性的问题,因为JMM模型中,实例变量是存储在堆空间的,而堆空间是线程共享的。
所有,同一Servlet实例在不同线程中,实例变量是共享的,就有被不同用户线程同时访问。
public class ConcurrentTest extends HttpServlet {
PrintWriteroutput; //此实例成员,会在不同线程中共享
@Override
protected void service(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String username;
response.setContentType("text/html;charset=gb2312");
username=request.getParameter("username");
output=response.getWriter();
try {
//为了突出并发问题,在这设置一个延时
Thread.sleep(5000);
output.println("用户名:"+username+"<BR>");
} catch (Exception e) {
e.printStackTrace();
}
}
}
https://www.cnblogs.com/gw811/archive/2012/09/07/2674859.html
相关文章推荐
- 深入研究Servlet线程安全性问题
- 深入研究Servlet线程安全性问题
- 深入研究Servlet线程安全性问题
- 深入研究Servlet线程安全性问题
- 深入研究Servlet线程安全性问题
- 深入研究Servlet线程安全性问题
- 深入研究Servlet线程安全性问题
- 深入研究Servlet线程安全性问题
- 深入研究Servlet线程安全性问题
- 深入研究Servlet线程安全性问题
- 深入研究Servlet线程安全性问题
- 深入研究Servlet线程安全性问题
- 深入研究Servlet线程安全性问题
- 深入研究Servlet线程安全性问题
- 深入研究Servlet线程安全性问题
- 深入研究Servlet线程安全性问题
- Servlet入门(二)延伸--深入研究Servlet线程安全性问题
- 深入研究Servlet线程安全性问题
- 深入研究Servlet线程安全性问题
- 深入研究Servlet线程安全性问题