您的位置:首页 > 其它

Servlet线程安全问题

2015-03-28 15:43 204 查看
在servlet百科中我们可以看到这么一段说明:“在 Web 应用程序中,一个 Servlet 在一个时刻可能被多个用户同时访问。这时 Web 容器将为每个用户创建一个线程来执行 Servlet。如果 Servlet 不涉及共享资源的问题,不必关心多线程问题。但如果 Servlet 需要共享资源,需要保证 Servlet 是线程安全的”通过这段话我们可以看出servlet是单例的。

那么如何保证servlet是线程安全的呢:

1、尽量采用局部变量,任何线程都不会修改其他线程的局部变量。如果要在不同的请求之间共享数据,应该使用会话(session)来共享这类数据。

2、只用 Servlet的成员变量来存放那些不会改变的数据。有些数据在 Servlet 生命周期中不发生任何变化,通常是在初始时确定的,例如如数据库连接名称。

3、对可能被请求修改的成员变量同步。有时数据成员变量或者环境属性可能被请求修改。当访问这些数据时应该对它们同步,以避免多个线程同时修改这些数据。

4、如果 Servlet 访问外部资源,那么需要同步访问这些资源。例如,假设 Servlet 要从文件中读写数据。当一个线程读写一个文件时,其他线程也可能正在读写这个文件。文件访问本身不是线程安全的,所以必须编写同步访问这些资源的代码。

servlet是单实例多线程的

servlet中的init方法只有在启动(例如web容器启动,要看loadOnStartup的设置)的时候调用,也就是只初始化一次,这就是单实例。

servlet在处理请求的时候 调用的是service方法,这个方法可以处理多个客户端的请求。

具体访问时:

JSP 在web容器中”翻译成servlet”由容器执行,web 容器本身就是提供的多线程,A,B,C 3个访问,建立3个独立的线程组,然后运行一个servlet。依次执行。

这就解决了多用户同一实例实行的困惑。

要注意几点:

1:servlet首先不是现成线程的。

2:Servlet体系结构是建立在Java多线程机制之上的,它的生命周期是由Web容器负责的。

Servlet容器会自动使用线程池等技术来支持系统的运行

3:设定jsp:<%@ page isThreadSafe=”false”%>来实现单线程。

当你需要保证数据一致性的时候,必须自己处理线程安全问题时可以考虑单线程。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: