action中共享变量的使用

来源:互联网 发布:redis订阅和发布 java 编辑:程序博客网 时间:2024/05/24 06:27

新项目上线以来,还算稳定, 没有什么大的问题。但是,最近几天发现一个奇怪的问题,本来是根据级别去取得用户信息,可是每天总会有那么一条两条错误数据。第一时间,仔细的查看了代码,可是看来看去,没有什么错误。只能使用最原始切最有效的手段:打印log日志咯。

第一次打印出来的日志,确确实实,级别不同,却取到了非当前级别的用户信息。不由得对验证级别的方法产生怀疑,可试来试去,终究是没有找出来该处有问题。只能重新换个角度去考虑了。

在差错的过程中,同伴提出了,当前用户信息和所添加的bean信息非同一人。这下,算是有了眉目,再次在这个地方进行了日志打印,终于,错误信息显露无疑,这种错误隐藏的真是太深,原因只有一个:对于struts中action的使用,没有真正的理解。

我们项目的初始方案:

由于我们的每个子类都要用到相同的用户信息,就决定在父类中定义了类变量bean,这样方便了每个子类的使用。当时我们没有考虑线程安全的问题,就出了以上奇怪的现象。

总结如下:struts中action本身是多线程的,但是每个action在系统启动的时候,只是生成了一个实例,因此每个线程所使用的都是同一个实例。而我们又在这个实例中定义了共享变量,也就是类属性,所有的线程也就共享了这个实例属性,在访问高峰的时候,才出现了线程不安全的问题,前者已经把共享实例做了修改,而后者还在使用已经被修改的实例变量。这也给我们敲响了警钟,对于正在开发中的项目做了调整,消除了共享变量的使用,改用方法传递的参数的办法,解决以上出现的问题,局部变量,只是归属于所调用线程本身,每个线程会从操作属于自己的变量,这样就不会再出现线程安全的问题了。

struts1中action是多线程的,所以,我们要考虑并发情况下线程安全的问题,据说struts2对于每个action做了处理,每个访问生成一个action实例,这样,就可以避免并发情况下线程安全的问题出现了。

在实践中发现问题,解决问题,从而得到自身的提高。

原创粉丝点击