【Servlet】Servlet的多线程并发情况
生活随笔
收集整理的這篇文章主要介紹了
【Servlet】Servlet的多线程并发情况
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
由于Servlet在Tomcat中是以單例模式存在的,所以當多個Servlet線程同時訪問了Servlet的共享數據,如成員變量,可能會引發線程安全問題。
下面是之前做的一個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 LoginServlet extends HttpServlet {private static String usernameRef;private static String passwordRef;public static void doPost(String username, String password) {try {usernameRef = username;if ("a".equals(username)) {Thread.sleep(5000);}passwordRef = password;System.out.println("username=" + usernameRef + " password=" + passwordRef);} catch (InterruptedException e) {e.printStackTrace();}}/*** 輸出樣例:* username=b password=bb* username=b password=aa* @param request* @param response* @throws ServletException* @throws IOException*/@Overridepublic void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {LoginThreadA threadA = new LoginThreadA();LoginThreadB threadB = new LoginThreadB();threadA.start();threadB.start();}@Overridepublic void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {doPost(request, response);}} public class LoginThreadA extends Thread {@Overridepublic void run() {LoginServlet.doPost("a", "aa");}} public class LoginThreadB extends Thread {@Overridepublic void run() {LoginServlet.doPost("b", "bb");}}運行的時候,有時的確會出現一些不符的username和password組合,的確會存在線程安全問題。
總結
以上是生活随笔為你收集整理的【Servlet】Servlet的多线程并发情况的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【数值分析】证明题一道
- 下一篇: 【Java】整数存储单元的设计与模拟