Servlet线程安全问题

来源:互联网 发布:淘宝怎么搜发票 编辑:程序博客网 时间:2024/06/05 21:17

在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”%>来实现单线程。
当你需要保证数据一致性的时候,必须自己处理线程安全问题时可以考虑单线程。

1 0
原创粉丝点击