Servlet的多线程并发问题

作者: _借东西的小人 | 来源:发表于2017-04-18 17:16 被阅读61次

servlet的自动加载

        默认情况下,当第一次访问servlet的时候创建servlet对象。如果servlet的构造方法或者init的方法中执行了比较多的逻辑代码,那么会导致第一次访问servlet的时候比较慢。
        这时侯我们只需要改变servlet创建的时机,提前到加载web应用的时候。只需要在servlet配置信息中,加上<load-on-startup>即可。<load-on-startup>标签中的值是整数的,多个<load-on-startup>标签,数字越大,优先级越低。

servlet的自动加载.jpg

servlet的并发问题

        因为servlet是多线程的,所以当多个servlet的线程同时访问了servlet的共享资源,比如说:成员变量,就会引发servlet的安全问题。下面将举例说明:
线程1执行,紧接着线程2执行,线程1还没执行count++,就会出现线程问题了。

public class ThreadServlet extends HttpServlet {
    int count = 1;
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        response.getWriter().write("你现在是第"+count+"个访客");
        count++;
    }
}

并发图片.jpg

        这时候只需要把使用到共享数据的代码块进行同步(使用synchronized关键字进行同步)。建议在servlet类中尽量不要使用成员变量。如果确实要使用成员,必须同步。而且尽量缩小同步代码块的范围。(哪里使用到了成员变量,就同步哪里!!),以避免因为同步而导致并发效率降低。
代码展示如下:

int count = 1;
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        synchronized (ThreadServlet.class){//锁对象必须是唯一的
        response.getWriter().write("你现在是第"+count+"个访客");
        count++;}
    }

运行效果:


同步图片.jpg

相关文章

  • Servlet的多线程并发问题

    servlet的自动加载 默认情况下,当第一次访问servlet的时候创建servlet对象。如果servlet的...

  • Servlet(2)-多线程同步问题和ServletContex

    Servlet多线程同步问题 由于Servlet/JSP默认为是以多线程模式执行的,所以,在编写代码时需要非常细致...

  • 14.Servlet的线程安全问题

    分析Servlet的优点和缺点: 优点:动态网页,跨平台的,单例的(速度快) 缺点:在面对多线程并发访问,Serv...

  • 后端架构师技术图谱(三)-并发、锁、设计模式(二)

    并发 多线程 《40个Java多线程问题总结》 线程安全 《Java并发编程——线程安全及解决机制简介》 一致性、...

  • 多线程并发 (五) ReentrantLock 使用和源码

    章节: 多线程并发 (一) 了解 Java 虚拟机 - JVM 多线程并发 (二) 了解 Thread 多线程并发...

  • 3.多线程的并发问题

    多线程在提高运行效率的同时,也带来了并发问题,所谓并发问题就是多线程操作共享资源,导致数据状态异常。以买票为例,1...

  • 闲言之PHP不支持多线程??

    前言 为什么考虑到多线程呢?--------为了有效率的解决并发问题; 那怎么将多线程应用结合到PHP应用解决并发...

  • synchronized

    synchronized 并发编程的三个问题:并发性,原子性,有序性 多线程并发时候可能出现可见性问题:就是在多线...

  • 一些基础之一

    高并发 面试的时候都喜欢问这个问题,解决高并发的问题根源在于解决高并发下共享资源的控制问题。也就牵扯到多线程下共享...

  • 10信号量与管程

    18.1信号量 回顾 ■并发问题 多线程并发导致资源竞争 ■同步概念 协调多线程对共享数据的访问 任何时刻只能有一...

网友评论

  • 6d96978eeefb:synchronized (ThreadServlet.class)

    你这种做法不好,应该只synchronize当前这个对象就行了。按你的做法,如果其它的servlet也synchronize了ThreafServlet.class,就会造成不必要的阻塞
    6d96978eeefb: @_借东西的小人 现在不明白没关系,等你再学一学之后再回来想想,到时候不明白我们再交流
    _借东西的小人: @TW李鹏 老师,我不明白你说的意思,我的那个synchronized的对象是唯一的,我不懂老师说的是会出现同样命名的synchronized的对象,还是说其他的。
  • 6d96978eeefb:下面将举例说明:
    线程1执行,紧接着线程2执行,线程1还没执行count++,就会出现线程问题了。

    这一块没有贴代码啊
    _借东西的小人: @TW李鹏 下去我会注意修改的,感谢老师

本文标题:Servlet的多线程并发问题

本文链接:https://www.haomeiwen.com/subject/lytqzttx.html