Servlet的多線程並發問題


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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM