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.提供资源唯一入口点(这样会减少并发带来的危险)
.....