Servlet的多线程并发问题

注意: servlet对象在tomcat服务器是单实例多线程的。html

由于servlet是多线程的,因此当多个servlet的线程同时访问了servlet的共享数据,如成员变量,可能会引起线程安全问题。java

   解决办法:tomcat

               1)把使用到共享数据的代码块进行同步(使用synchronized关键字进行同步)安全

              2)建议在servlet类中尽可能不要使用成员变量。若是确实要使用成员,必须同步。并且尽可能缩小同步代码块的范围。(哪里使用到了成员变量,就同步哪里!!),以免由于同步而致使并发效率下降。服务器

package com.loaderman.demo; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; public class TestServlet extends HttpServlet { int count = 1; //servlet的多线程并发问题
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=utf-8"); synchronized (TestServlet.class) {//锁对象必须惟一。建议使用类对象
            response.getWriter().write("你如今是当前网站的第" + count + "个访客");   //线程1执行完 , 线程2执行 //线程1尚未执行count++
            try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } count++; } } }
相关文章
相关标签/搜索