多線程之servlet線程安全

1、servlet是線程安全的嗎?

servlet天生就是多線程的,意思是一個請求,就會有一個線程來處理,但是其是否是線程安全的呢?下面通過實驗來證明。

編寫類:

<span style="font-size:18px;">package com.ht.action;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@SuppressWarnings("serial")
public class TestServlet extends HttpServlet {
	private String username;
	@Override
	protected void service(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		PrintWriter writer = null;
		try {
			writer = resp.getWriter();
			username = req.getParameter("name");
			System.out.println(this);
			System.out.println(Thread.currentThread().getName() + "-->" +username);
			try {
				Thread.sleep(10000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			writer.write(username);
			writer.flush();
		} catch(Exception e) {
			e.printStackTrace();
		} finally {
			writer.close();
		}
	}
}
</span>

這個類主要獲取請求的name變量,然後再打印回瀏覽器,爲了測試,其中讓線程睡眠10秒,開啓兩個瀏覽器訪問,

一個是:http://localhost:8888/testServlet?name=a

另一個是:http://localhost:8888/testServlet?name=b,最後發現兩個輸出都是b,證明了servlet不是線程安全的。當用戶發送請求,容易會實例化servlet,並且只實例化一次,它是單列的,用這個單列來處理所有的請求。

2、struts2是線程安全的嗎?

用同樣的方法去驗證,其結果是,struts2時線程安全的。

每個請求,容器都會生成一個action實例化,所以他是線程安全的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章