关于struts2 的单例和多例及线程安全的问题
2016-02-16 17:57
316 查看
我知道struts 2的Action是多实例的并非单例,也就是每次请求产生一个Action的对象。原因是:struts 2的Action中包含数据,例如你在页面填写的数据就会包含在Action的成员变量里面。如果Action是单实例的话,这些数据在多线程的环境下就会相互影响,例如造成别人填写的数据被你看到了。它存在着线程不安全。
而struts 1的Action是单实例的,因为它的数据保存在Form类中,多线程环境下,Action只负责处理一些逻辑,并没有数据,也就是大家把它当做一个工具使用。同样servlet也是单实例的。它是线程安全的
而struts 1的Action是单实例的,因为它的数据保存在Form类中,多线程环境下,Action只负责处理一些逻辑,并没有数据,也就是大家把它当做一个工具使用。同样servlet也是单实例的。它是线程安全的
而在使用spring来生成action的时候,发现生成的action居然全是单例的。这不是让我的程序默认就跑出bug来么?上个用户提交的信息,如果下个用户没填,居然跑到上个用 户输入的信息去了。 背景: 1) Struts2会对每一个请求,产生一个Action的实例来处理. 2) Spring的Ioc容器管理的bean默认是单实例的. 首先从数据安全性的问题上考虑,我们的Action应该保证是多例的,这样才不会出现数据问题。但是如果有的action比如只有admin才能操作,或者某些action,全站公用一个 来提高性能,这样的话,就可以使用单例模式 不过幸好,Spring的bean可以针对每一个设置它的scope,所以,上面的问题就不是问题了。 如果用单例,就在spring的action bean配置的时候设置scope="prototype" 或者singleton = "false" 单例模式是spring推荐的配置,它在高并发下能极大的节省资源,提高服务抗压能力。spring IOC的bean管理器是“绝对的线程安全”。 用ThreadLocal是为了保证线程安全,实际上ThreadLoacal的key就是当前线程的Thread实例。 单例模式下,spring把每个线程可能存在线程安全问题的参数值放进了ThreadLocal。这样虽然是一个实例在操作,但是不同线程下的数据互相之间都是隔离的, 因为运行时创建和销毁的bean大大减少了,所以大多数场景下这种方式对内存资源的消耗较少,而且并发越高优势越明显。 总的来说就是,单利模式因为大大节省了实例的创建和销毁,有利于提高性能,而ThreadLocal用来保证线程安全性。
相关文章推荐
- java正则表达式特殊字符
- Java程序打印日历
- struts2 action获取jsp参数的三种方式
- 记录-java执行请求的URL
- Java中转UTC时间字符串(含有T Z)为local时间
- eclipse启动错误
- Spring MVC —— 简单使用
- 【Java-IO】IO入门
- Java编写日历程序,显示当前月份及日期
- 【Java-IO】RandomAccessFile
- Eclipse: Android Device Chooser - Unknown Target
- java的date类型无法读取 出现错误net.sf.json.JSONException: java.lang.reflect.InvocationTargetException
- 使用Spring Security实现权限管理
- 使用Java+MySQL做的简易留言板
- java中文词语大小比较
- Java Map的几种循环方式学习总结
- 第一个java程序Hellorld
- 【JVM系列】Java类加载器
- spring 在启动服务器的时候报错 Could not open ServletContext resource [/WEB-INF/dispather-servlet.xml]
- eclipse — Failed to load the JNI shared library”……\jvm.dll问题原因以及解决方案