Struts2 控制器的线程安全问题
原理:
为每个请求创建一个控制器实例即可解决线程并发安全问题! 在使用Spring时候务必使用 @Scope("prototype") 属性.
在struts2中,每一个请求都会有一个单独线程,该线程里会有单独的action,若使用Spring管理Struts2,则用以上@Scope("prototype") 方法解决(即在Action类前面添加该标签)
问题:
1.dao接口会有线程安全问题吗? 肯定是没有的,例如云笔记项目,dao是单例的,无状态的,安全的;
2.service中会有线程安全问题吗?可能存在的,若业务方法之间没有使用公共变量,就不会有问题(service的方法不访问公共变量即可),但是web层时可能存在公共变量的,例如session、application,这是多线程并发访问的,所以在访问这类变量的时候需要加锁,synchronized或者使用队列来处理
多线程问题
- Web应用是并发访问的
- 当多个并发访问了同一个数据时候将出现并发安全性问题
- 尽量并发解决问题, 性能好
- 必要的时候使用同步处理, 性能差
- 超过300并发, 应该采用服务器集群解决
- Tomcat 默认值是 200
无状态类: 没有公共的可读写的实例变量的类, 没有线程安全问题 有状态类: 有公共的可读写实例变量类, 有线程安全问题.
在云笔记,controller是单例的,存在线程安全问题,但是Controller类没有成员变量,就是为了避免线程安全问题