`
chinalhkboy
  • 浏览: 19269 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类

★Struts1线程非安全,scope="prototype"或singleton="false"的作用

SSH 
阅读更多

10年第一份工作,公司里有个B2B商务网,其中的公司主页板块,出现了如下问题:

项目运行一段时间(2~3天)后,点任何一个公司名称进去都显示的是同一个公司的信息 ,重启tomcat问题消失,过段时间又是这个问题。

后来有个前辈来公司,前辈就是不一样,在Spring配置Action的地方加上singleton="false",问题解决了。

我在网上查,singleton:单例,singleton默认配置是"true",singleton="false"就是多例了,当时不懂为啥这样。

 

在新公司同样用SSH框架,没有配置singleton="false",并没有出现以前的问题。

 

今天看传智播客Hibernate视频第50《_Session与SessionFactory的多线程问题》,视频中提到线程安全的3种形式:1.加锁2.不能被修改的类(String、Integer),每次调用都新产生一个对象3.只读的,只提供获取不提供修改的类。然后视频中讲到Struts1的action是单例的,是非线程安全的,Struts2的action是多例的,是线程安全的,想到之前项目的问题,似乎有联系,网上查查资料,终于明白了

 

以下是网上的解释:

spring scope="prototype" 学习笔记

<bean id="**Action" class="com.web.actions.**Action" scope="prototype" >
    <property name="**Service" ref="**Service" />
</bean>

 

scope="prototype"没写的问题,项目中对一个表的增删该操作是用一个action(单例),这个action有add,update,delete,save这些方法,添加和修改是共用一个页面,当页面得到id时代表进行的修改操作,反之是添加操作,因为在配置spring的bean是忘了写scope="prototype",所以每次添加时都显示最后一次访问过的记录。scope="prototype"会在该类型的对象被请求时创建一个新的action对象(多例)。如果没有配置scope=prototype则添加的时候不会新建一个action ,他仍然会保留上次访问的过记录的信息。
webwork的Action不是线程安全的,要求在多线程环境下必须是一个线程对应一个独立的实例,不能使用singleton。所以,我们在Spring配置Webwork Action Bean时,需要加上属性scope=”prototype”或singleton=”false”
singleton模式指的是对某个对象的完全共享,包括代码空间和数据空间,说白了,如果一个类是singleton的,假如这个类有成员变量,那么这 个成员变量的值是各个线程共享的(有点类似于static的样子了),当线程A往给变量赋了一个值以后,线程B就能读出这个值。因此,对于前台 Action,肯定不能使用singleton的模式,必须是一个线程请求对应一个独立的实例。推而广之,只要是带数据成员变量的类,为了防止多个线程混用数据,就不能使用singleton 。对于我们用到的Service、Dao,之所以用了singleton,就是因为他们没有用到数据成员变量,如果谁的Service需要数据成员变量,请设置singleton=false。

分享到:
评论

相关推荐

    Spring实战之Bean的作用域singleton和prototype用法分析

    在并发环境中,由于`prototype` Bean的多实例特性,需要特别注意线程安全问题,因为不同线程可能会同时访问到不同的实例。 总结起来,Spring中的`singleton`和`prototype`作用域是管理Bean生命周期的重要手段。`...

    singleton Bean 创建 prototype Bean

    在Spring框架中,Bean的两种主要作用域是Singleton和Prototype。Singleton Bean表示在整个Spring IoC容器中只有一个实例,而Prototype Bean则表示每次请求都会创建一个新的实例。这两种作用域的使用场景和实现方式都...

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

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

    Spring IOC Bean标签属性介绍(教学视频+源代码)

    1.4 当 Scope="singleton" 且 lazy-init="true" 时 1.5 当scope="prototype"时 1.6 当scope="prototype" 且 lazy-init="true" 时 1.7 小结 1.8 depends-on 1.8.0 实体类JavaBean 1.8.0.1 Student类 1.8.1 配置文件都...

    通俗易懂spring之singleton和prototype.docx

    本文主要聚焦于两种常用的作用域:singleton和prototype。 **Singleton(单例)** Singleton模式意味着每个Bean在Spring容器中只会存在一个实例。当你通过`ApplicationContext`获取一个配置为`scope="singleton"`...

    Head First 设计模式 (五) 单件模式(Singleton pattern) C++实现

    单件模式(Singleton pattern)是设计模式中的一种结构型模式,它的主要目的是确保一个类只有一个实例,并提供一个全局访问点。这种模式常用于系统中需要频繁创建和销毁的对象,如日志服务、线程池或者数据库连接等...

    浅议单例模式之线程安全(转)

    在多线程环境下,线程安全的单例模式尤为重要,因为如果不正确实现,可能会导致多个线程同时创建多个实例,违反了单例模式的基本原则。 在Java中,单例模式通常有以下几种实现方式: 1. 饿汉式(静态常量): ...

    Java线程安全的Singleton模式:深入分析与实现

    通过使用饿汉式、懒汉式与双重检查锁定、静态内部类或枚举等方式,可以确保Singleton实例的唯一性和线程安全。每种方式都有其适用场景和优缺点,开发者应根据实际需求选择合适的实现方式。正确实现Singleton模式,...

    详解Spring中bean的scope以后使用

    需要注意的是,虽然`Singleton`作用域下的Bean在整个容器中是唯一的,但这并不意味着它是线程安全的。开发者需要确保Bean内部的状态管理符合多线程环境的要求。 #### 四、Prototype作用域 **Prototype**作用域下的...

    C++完美实现Singleton模式

    1. **线程安全**:在多线程环境下,如果多个线程同时尝试创建Singleton实例,可能会导致创建多个对象。为了保证线程安全,通常需要在`Instance()`方法中添加互斥锁(`mutex`)或者使用原子操作(`std::atomic`)。...

    Java并行(4):线程安全前传之Singleton1

    【Java并行(4):线程安全前传之Singleton1】 在Java编程中,Singleton设计模式是一种常用的设计模式,它的主要目标是确保一个类只有一个实例,并提供一个全局访问点。在多线程环境中,实现线程安全的Singleton至关...

    C++ 实现的singleton 模式

    为了进一步提高Singleton的安全性和线程安全性,可以考虑使用线程局部存储(TLS)或互斥锁(mutex)。在多线程环境中,如果没有适当的同步机制,`getInstance()`可能会在不同线程中同时创建多个实例。在C++11及更高...

    Singleton

    这种方式是线程安全的,且只在Singleton类加载时初始化Singleton实例,因此既解决了懒加载,又避免了同步问题。 ```java public class Singleton { private Singleton() {} private static class Singleton...

    Singleton 单例模式

    这种方式非线程安全,但在Java 1.5后可以通过`synchronized`关键字保证线程安全。 ```java public class Singleton { private static Singleton instance; private Singleton() {} public synchronized ...

    Spring之scope讲解测试示例代码

    1. **singleton(单例)**:这是默认的scope,每个容器中只有一个实例。无论多少次请求这个Bean,Spring都会返回同一个对象。在`WebContent/WEB-INF/spring/appServlet/servlet-context.xml`或`src/main/resources/...

    基于java的企业级应用开发:Bean的作用域.ppt

    Singleton保证了线程安全性,减少了内存消耗,但可能不适合有状态的对象。而Prototype则提供了更大的灵活性,允许每个依赖有其独立的状态,但可能会增加内存开销并可能导致并发问题,因此需要谨慎处理。 此外,...

    多线程下的singleton

    总结起来,多线程下的Singleton设计需要考虑线程安全问题,通过如双重检查锁定、静态内部类或枚举等方式实现线程安全的单例模式。同时,要注意单例模式可能带来的潜在问题,并根据实际情况选择合适的设计策略。

    spring的bean作用域

    - 配置Prototype Bean的例子是:`&lt;bean id="role" class="spring.chapter2.maryGame.Role" scope="prototype"/&gt;` 或 `&lt;bean id="role" class="spring.chapter2.maryGame.Role" singleton="false"/&gt;` 3. **Request...

    单例模式封装

    1. 饿汉式单例:在类加载时就完成了实例化,线程安全,但可能造成不必要的资源浪费。 ```cpp class Singleton { public: static Singleton& getInstance() { return instance; } private: Singleton() {} ...

    Spring中的singleton和prototype的实现

    其中,singleton和prototype是两个最基本的bean作用域。本文将详细介绍Spring中的singleton和prototype的实现,通过示例代码和测试结果,帮助读者深入理解这两种bean作用域。 Singleton Singleton模式是Spring...

Global site tag (gtag.js) - Google Analytics