
有状况和无状态的对象完全定义:
有状况对象(Stateful Bean),就是有事例字段的对象,可以留存数据,是非线程安全的。一般是prototype scope。
无状态对象(Stateless Bean),就是没有实例字段的对象,不能保存数据,是不变类,是线程安全的。一般是singleton scope。
如Struts2中的Action,除非内部有事例字段User,当读取新增用户方式时,user是用于保留数据,假如此action是有状况对象。多个线程同时访问此action时 会引发user字段的不一致。所以action的scope要设计成prototype,如果,User类放在threadLocal里来维持多个线程不会造成User变量的乱串(此种场景没必要放在threadLocal内)。
而Service内部一般只有dao实例字段 如userDao, 因为userDao是无状态的对象(外部无示例字段且不能保存数据),不过service应该无状态的对象。
publicclassXxxAction{

//由于多线程环境下,user是摘录对象,是非线程安全的
publicUseruser;
......
}
publicclassXxxService{
//因为有billDao属性,但billDao是没有状态信息的,是StatelessBean.

BillDaobillDao;
......
}
对于某些会以多线程运行的单例类
局部变量不会受多线程影响,
成员字段会遭受多线程影响。

多个线程读取同一个对象的同一个方法:
或者方式里无局部方差,假如不受任何影响;
或者方式里有局部方差,只有读操作,不受影响;存在写操作,权衡多线程影响值;
例如Web应用中的Servlet,每位方法中对局部变量的操作都是程自己独立的四核区域内完成的,不过是线程安全的。
对于成员字段的操作,可以使用ThreadLocal来确保线程安全。
springMVC中,一般Controller、service、DAO层的scope均是singleton;

每个请求都是单独的线程,而且同样访问同一个Controller对象,因为并没有修改Controller对象,相当于针对Controller对象而言,只是读操作,没有写操作,不需要做同步处理。
Service层、Dao层用默认singleton就行,并且Service类也是dao这样的特性,但dao这些类都是没有状态信息的springmvc日志处理,也就是 相当于不变(immutable)类,不过不影响。
Struts2中的Action因为会有User、BizEntity这样的事例对象,是有状况信息 的,在多线程环境下是不安全的,不过Struts2默认的实现是Prototype模式。在Spring中,Struts2的Action中scope 要配成prototype作用域。
Spring并发访问的线程安全性问题
由于Spring MVC默认是Singleton的,不过会造成一个潜在的安全隐患。根本核心是instance变量保持状态的难题。这意味着每个request过来,功能总会用原有的instance去处理,如此使得了两个结果:
一是我们不用每次创建Controller,
二是削减了对象创建和废品收集的时间;
由于只有一个Controller的instance,当多个线程同时读取它的时候,它上面的instance变量就不是线程安全的了,会发生窜数据的难题。
同样大多数情况下springmvc日志处理,我们根本不需要考虑线程安全的难题,诸如dao,service等,假如在bean中声明了案例字段。因此,我们在使用spring mvc 的contrller时,应避免在controller中定义案例字段。
如:
本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-119310-1.html
飞机对敌舰和空中飞行采取驱逐行动形成武力对峙
有的东西保质期过了擦掉又从新打上新的生产日期