Servlet 定義中並未表明是單例,只不過Servlet Container只會對每一個Servlet創建一個實例。每個獨立的線程服務一個請求,這樣來處理併發。如果希望Servlet Container創建過個實例處理高負載請求,可以實現SingleThreadModel(Servlet2.4之後不建議使用)。
Servlet Container創建一個Servlet實例來併發處理所有請求,這樣減少了內存消耗,同時使持久化數據的管理更加簡單。
使用Servlet時,需要注意:
1.局部變量是線程安全的(由於併發的原因,實例變量難以保證一致性,當然可以使用同步鎖來控制,不過這樣效率會大受影響)
2.不變對象是線程安全的,如下:
public Class Player
{
private String name;
private String number;
public Player(String name, String number)
{
this.name = name;
this.number = number;
}
public String getName()
{
return this.name;
}
public String getNumber()
{
return this.number;
}
}
也許你已經注意到,這裏沒有使用set方法來對域進行復制,這正是刻意而爲之。生成對象時,對屬性進行復制,之後不再修改,這樣的對象在servlet使用中是線程安全的。
3.提供資源唯一入口點(這樣會減少併發帶來的危險)
.....