sevlet线程安全问题理解与解决
2015-03-05 10:09
246 查看
Servlet采用多线程机制,当客户端第一次请求某个Servlet时,Servlet容器将会根据web.xml配置文件实例化这个Servlet类。当有新的客户端请求该Servlet时,一般不会再实例化该Servlet类,即如果有多个线程在使用这个实例,Servlet容器会使用线程池等技术来支持系统的运行(也就是说当多个线程访问同一个Servlet时,可能出现多个线程同时访问同一个资源的情况,这可能导致数据的不一致),在实例变量使用不当时,便会出现线程安全问题,产生一些莫名其妙的错误。
解决方法大致有三种:
1.Servlet类实现SingleThreadModel接口(使得对于每一个请求创建一个新的Servlet实例,造成了大量的系统开销,不推荐使用)
2.使用synchronized(this){……}来同步对共享数据的操作(这保证了一次只有一个线程能访问被保护的区域,但也正因如此,系统处理请求的吞吐量大大降低,大部分请求处于阻塞状态)
3.避免使用实例变量,将其改为局部变量(方法中的临时变量是在栈上分配空间,而每个线程都有自己私有的栈空间,所以不会产生线程安全问题;此方法最佳)
解决方法大致有三种:
1.Servlet类实现SingleThreadModel接口(使得对于每一个请求创建一个新的Servlet实例,造成了大量的系统开销,不推荐使用)
2.使用synchronized(this){……}来同步对共享数据的操作(这保证了一次只有一个线程能访问被保护的区域,但也正因如此,系统处理请求的吞吐量大大降低,大部分请求处于阻塞状态)
3.避免使用实例变量,将其改为局部变量(方法中的临时变量是在栈上分配空间,而每个线程都有自己私有的栈空间,所以不会产生线程安全问题;此方法最佳)
相关文章推荐
- 理解oracle的网络结构 解决你的连接问题
- 深入理解 ASP.NET 动态控件 (Part 4 - 解决问题)
- 关于流和缓冲区的理解以及一般标准输入问题的解决方法小结
- 关于JSP乱码问题的初步理解和解决
- 解决函数中返回局部指针变量的问题,加深理解《堆和栈》问题。
- 理解oracle的网络结构 解决你的连接问题
- J2EE Design Patterns 3 -- Pattern太多了,没必要教条,把Pattern当做启发,理解问题和掌握解决问题的通用方法和思想最重要。
- 要在技术和学术上有所成就,现在很多青年人最需要解决的其实不是知识问题,而是心理上的问题,是对“成功”定义的理解。
- IE兼容问题解决根源:深刻理解hasLayout属性,原理与使用方法
- 深入理解 ASP.NET 动态控件 (Part 4 - 解决问题)
- Java SE -- 多线程 线程安全问题解决
- 理解SQLSERVER中的排序规则,解决无法正确显示中文字符的问题
- 理解SQLSERVER中的排序规则,解决无法正确显示中文字符的问题
- 主题:理解oracle的网络结构,解决连接问题
- 线程安全问题(解决) -------使用spring 的action-servlet.xml解决struts线程问题
- 今天遇到CFLAGS被改变导致编译出错的问题[已解决 原创] 但还有未理解的地方
- 关于流和缓冲区的理解以及一般标准输入问题的解决方法小结 (fflush() setbuf() )
- 理解SQL SERVER中的排序规则,解决项目中无法正确显示中文字符的问题
- Java中线程安全问题个人理解
- [转载]理解Tomcat的Classpath-常见问题以及如何解决