注意: 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++; } } }