Java Web笔记 – Servlet多线程同步问题及其解决方法
本文由发表于6年前 | J2EE | 暂无评论 |  被围观 10,272 views+
ServletContext和Web应用关系:
1、Servlet中的多线程问题:2、举例说明:3、解决方法:
ServletContext和Web应用关系:

servlet容器启动Web应用,并为每个Web应用创建唯一的ServletContext对象。可以吧ServletContext看成一个Web应用的服务器端组件的共享内存。在ServletContext中可以存放共享数据,提供了读取或设置共享数据的方法:

setAttribute(String name, Object object); getAttribute(String name);

在Servlet中获取application(ServletContext)

ServletContext context = req.getSession().getServletContext();
1、Servlet中的多线程问题:

由于Servlet/JSP默认是以多线程模式执行的,但是Servlet是单实例的,所以,在编写代码时需要考虑多线程的并发同步问题。例如,当有多个用户同时访问某个Servlet时,会访问这个唯一的Servlet实例中的成员变量,如果对成员变量进行赋值,就会导致数据不一致。

2、举例说明:

下面这个Servlet当有多个用户同时访问时,由于Servlet是单实例的,在10秒钟内有两次访问时,这是共享的username成员就赋值为后者传递过来的username,当两者返回给客户端数据时,如果通过以下方式获取username,则都是得到后者传递的username的值:

request.getAttribute("username");

但是如果从request请求(每个用户对应一个请求,两个请求互不干扰)范围内获取username则得到的是各自传递给该Servlet的值:

request.getParameter("username");
public class ThreadServlet extends HttpServlet {

    private String username;
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        this.username = req.getParameter("username");
        try{
            Thread.sleep(10000);
        } catch(Exception e){
            e.printStackTrace();
        }
        req.setAttribute("username", username);
        req.getRequestDispatcher("result.jsp").forward(req, resp);
    }
}

为了解决上面的问题,可以把成员变量username变为 doGet的局部变量。

3、解决方法:
a、很少使用成员变量,一般使用局部变量。
b、或者使用同步代码块
c、实现javax.servlet.SingleThreadModel,使得Servlet实例以单线程方式运行,即是同一时刻只有一个线程执行Servlet的service()方法。
除了文章中有特别说明,均为IT宅原创文章,转载请以链接形式注明出处。
本文链接:http://www.itzhai.com/java-web-notes-servlet-multi-thread-synchronization-problems-and-their-solutions.html
关键字: ,
arthinking Java技术交流群:280755654,入门群:428693174 more
分享到:
 
2011 11/10
如果您有更好的原创技术博文或者观点,欢迎投稿:admin@itzhai.com,或者关注订阅左侧浮动面板的微信号订阅IT宅itread)发送消息。
文章评论
    没有评论
给我留言

有人回复时邮件通知我
J2EE的相关文章
随机文章 本月热门 热评
1 一些常用的音乐英语词汇 2012/10/22
2 SortedMap接口的实现类TreeMap介绍和实现Comparator自定义比较器 2011/10/16
3 Servlet.service() for servlet jsp threw exception,NullPointerException 2011/7/27
4 中小应用关系型数据库设计基本思路 2014/8/31
5 chrome插件编写中需要了解的几个概念和一些方法 2013/6/5
6 jQuery使用load函数访问Struts2中的Action实现局部刷新和注册事件 2011/5/28
友情推荐 更多
破博客 文官洗碗安天下,武将打怪定乾坤。多么美好的年代,思之令人泪落。
Mr.5's Life 白天是一名程序员,晚上就是个有抱负的探索者
行知-追寻技术之美 关注大数据,分布式系统
我爱编程 编程成长轨迹
Cynthia's Blog 学习笔记 知识总结 思考感悟
 
猜您喜欢
欢迎关注我的公众号 IT宅
关于IT宅 文章归档

IT宅中的文章除了标题注明转载或有特别说明的文章,均为IT宅的技术知识总结,学习笔记或随笔。如果喜欢,请使用文章下面提供的分享组件。转载请注明出处并加入文章的原链接。 感谢大家的支持。

联系我们:admin@itzhai.com

Theme by arthinking. Copyright © 2011-2015 IT宅.com 保留所有权利.