`
kakashi
  • 浏览: 23926 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

关于struts 1 中的线程问题

    博客分类:
  • j2ee
阅读更多


今天突然发现几个月前写的代码中的一个线程问题.在这里做个笔记:

因为在struts1中在整个web生命周期中,web服务器只为每个action产生一个实例,所以就会产生线程问题,就必须要编写线程安全的代码.

需求是这样,简单的来说我需要保存一个学生的一些信息,但之前我需要加载这个学生相关的一些信息,信息量很大,然后在这些信息中筛选出需要的保存起来.关键在于这个加载的过程,因为信息量比较大所以我想怎么能够尽量提高它的效率.

我最开始的想法:能够在用户进入保存页面的时候先预先把学生信息加载好,然后用户在保存的时候就能够只做保存的事情,也就是把本来该一个动作做的事情分开城两个动作来做.这样来提升用户的体验.

service层中的代码:

这样的话不会每次加载学生信息的时候都新建一个对象,同一个student就不用加载了

每次进保存页面的时候执行getInstance加载信息,保存的时候就执行getModelByModelType,取出加载的性息.

我满心欢喜,以为自己在达到需求的同时又兼顾了效率.但是现在看来却有重大的问题.

我从开始考虑到写出的代码都没有考虑多线程的情况

一个学生进入了保存页面,执行了getInstance,在保存之前另一个学生又进来了,重新执行了getInstance,这样就把上个学生的信息覆盖了,最后两个学生保存的都是后一个学生的信息.

怎么改呢?

首先想到的是线程同步,我把这个类所有的方法都加上synchronized,这个在同一个时间只能有一个学生调用这个类的方法,其他都得排队(这里要把所有的方法都加synchronized,因为锁是针对class的,一个线程调用了这个类中的一个同步方法,那么其他线程在同一时间不能调用任何一个同步方法).但这也没对.

因为我把加载信息和保存信息在serviece中放成两个方法,这样就算同步了方法也会造成问题.

怎么办,1)是把加载信息和保存信息在service中放成一个方法,这样就可以用同步来解决问题.

2)是每次getInstance的时候都生成了一个新的对象,也不会有问题

最终我选择了第2种,没错,效率比较低,不过在这种情况下我也实在想不出两全其美的办法,如果谁有更好的方法希望提出来.

 

总结,在struts1中要特别注意线程问题,也就是你编写的类最好是非可变类,所谓非可变类就是你的方法中不要有各个方法之间共享的变量,如上面的studKey.即使有也要加上final让它成为只读的.

如果不是则很容易产生线程问题

 

 

 

 

 

 

0
0
分享到:
评论

相关推荐

    struts1,struts2,webwork,线程安全问题

    在Struts1中,每个`Action`类实例是被多个请求重用的,这使得它在多线程环境下存在潜在的线程安全问题。当多个线程同时访问一个`Action`实例时,可能会因为共享状态而导致数据不一致或其他并发问题。 - **Struts1中...

    servlet与Struts action线程安全问题分析

    Servlet和Struts Action是两种常见的Java Web开发组件,它们在多线程环境下运行时可能存在线程安全问题。线程安全是指在多线程环境中,一个类或者方法能够正确处理多个线程的并发访问,保证数据的一致性和完整性。 ...

    servlet与Struts action线程安全问题分析(pdf)

    在Struts 1.x版本中,Action对象也是被复用的,这就意味着如果Action类中包含实例变量,则可能会出现类似Servlet中的线程安全问题。 解决Struts Action的线程安全问题的方法与解决Servlet中的方法类似。通常建议...

    struts1和struts2的区别

    - **Struts1**: 在Struts1中,所有的业务逻辑和请求处理都通过单个Action类来完成。这意味着所有相关的请求都会被转发到同一个Action对象上进行处理。 - **Struts2**: Struts2中的Action更像是工厂模式下的产品,...

    Struts中action线程安全问题解析

    然而,在Struts1中,Action实例并不是为每个请求单独创建的。默认情况下,Struts1会使用一个Action实例来处理多个请求,这就可能导致线程安全问题。如果Action中包含任何可变的成员变量,这些变量可能会在并发请求...

    Struts2与Struts1区别

    - 在 Struts1 中,Action 类需要继承自一个抽象基类,这限制了其可扩展性和定制性。而 Struts2 改进了这一点,Action 类可以实现 Action 接口,也可以实现其他接口,提供了更多的灵活性。ActionSupport 类则提供了...

    Struts1小demo

    在Struts1中,Action类扮演Controller的角色,Servlet或JSP处理View,而业务逻辑则封装在JavaBean中。 2. **配置文件**:Struts1的核心配置文件是struts-config.xml,它定义了Action、Form Bean、ActionMapping、...

    struts1和struts2区别

    - **Struts2**:Action对象为每个请求创建一个新的实例,消除了线程安全问题,提高了性能。 3. **Servlet依赖**: - **Struts1**:Action直接依赖于Servlet API,需要HttpServletRequest和HttpServletResponse...

    struts1&struts2

    - **Struts2** 为每个请求创建新的Action实例,解决了线程安全问题,同时也更易于管理和测试。 5. **Servlet依赖** - **Struts1.x** 的Action类直接依赖于Servlet API,这使得测试变得更加困难。 - **Struts2** ...

    struts1和struts2的区别(详细)

    此外,Struts1中的Action类必须实现`Action`接口,并重写`execute`方法来处理请求。 - **Struts2**: 相比之下,Struts2中的Action是多例的,每次请求都会创建一个新的Action实例,这样就避免了线程安全的问题。...

    Struts1和Struts2的区别和对比

    在Struts1中,Action类需要继承一个抽象基类,这限制了Action的可定制性和灵活性。而Struts2则更倾向于使用接口,Action类可以实现Action接口或其他自定义接口,甚至可以直接使用具有execute方法的POJO对象。Struts2...

    转:struts1与struts2的区别

    - **Struts1**: Struts1中的Action采用单例模式,因此必须确保线程安全性。这意味着开发者需要特别注意Action类中的资源管理,确保其线程安全或进行适当的同步操作。 - **Struts2**: 在Struts2中,为每个HTTP请求...

    struts2 与 struts1的区别

    ### Struts2 与 Struts1 的核心区别 #### 一、架构设计及Action实现...综上所述,Struts2相比Struts1在架构设计、线程安全性、输入处理、表单验证等方面进行了大量的改进和优化,使得其更适合现代Web应用的开发需求。

    struts1的服务器端验证

    在Struts1中,验证通常通过配置文件进行,这个配置文件定义了各种验证规则,以检查用户提交表单时的数据是否符合预期格式和约束。这些规则可以包括基本的数据类型检查、长度限制、格式验证(如电子邮件地址或电话...

    Struts1与Struts2本质区别

    - **Struts 2**:每个请求都会创建一个新的Action实例,消除了线程安全问题,同时也减少了开发者在处理并发请求时需要考虑的问题。 #### 3. Servlet依赖方面的对比 - **Struts 1**:Action的方法签名中包含了`...

    Struts2和Struts1的区别,详细点,主要说说Struts2

    - **Struts1**中的Action对象在整个请求周期内是单例模式的,这意味着所有请求都会共用同一个Action实例,这可能会导致线程安全问题。 - 相比之下,**Struts2**为每个请求创建一个新的Action实例,这不仅提高了安全...

Global site tag (gtag.js) - Google Analytics