Servlet须知--如何使Servlet线程安全

来源:互联网 发布:互联网金融 知乎 编辑:程序博客网 时间:2024/05/06 01:50

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

.....