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實例化,所以他是線程安全的。