注意: servlet對象在tomcat服務器是單實例多線程的。
因為servlet是多線程的,所以當多個servlet的線程同時訪問了servlet的共享數據,如成員變量,可能會引發線程安全問題。
解決辦法:
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++; } } }