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。
分享到:
相关推荐
在并发环境中,由于`prototype` Bean的多实例特性,需要特别注意线程安全问题,因为不同线程可能会同时访问到不同的实例。 总结起来,Spring中的`singleton`和`prototype`作用域是管理Bean生命周期的重要手段。`...
在Spring框架中,Bean的两种主要作用域是Singleton和Prototype。Singleton Bean表示在整个Spring IoC容器中只有一个实例,而Prototype Bean则表示每次请求都会创建一个新的实例。这两种作用域的使用场景和实现方式都...
Servlet和Struts Action是两种常见的Java Web开发组件,它们在多线程环境下运行时可能存在线程安全问题。线程安全是指在多线程环境中,一个类或者方法能够正确处理多个线程的并发访问,保证数据的一致性和完整性。 ...
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 配置文件都...
本文主要聚焦于两种常用的作用域:singleton和prototype。 **Singleton(单例)** Singleton模式意味着每个Bean在Spring容器中只会存在一个实例。当你通过`ApplicationContext`获取一个配置为`scope="singleton"`...
单件模式(Singleton pattern)是设计模式中的一种结构型模式,它的主要目的是确保一个类只有一个实例,并提供一个全局访问点。这种模式常用于系统中需要频繁创建和销毁的对象,如日志服务、线程池或者数据库连接等...
在多线程环境下,线程安全的单例模式尤为重要,因为如果不正确实现,可能会导致多个线程同时创建多个实例,违反了单例模式的基本原则。 在Java中,单例模式通常有以下几种实现方式: 1. 饿汉式(静态常量): ...
通过使用饿汉式、懒汉式与双重检查锁定、静态内部类或枚举等方式,可以确保Singleton实例的唯一性和线程安全。每种方式都有其适用场景和优缺点,开发者应根据实际需求选择合适的实现方式。正确实现Singleton模式,...
需要注意的是,虽然`Singleton`作用域下的Bean在整个容器中是唯一的,但这并不意味着它是线程安全的。开发者需要确保Bean内部的状态管理符合多线程环境的要求。 #### 四、Prototype作用域 **Prototype**作用域下的...
1. **线程安全**:在多线程环境下,如果多个线程同时尝试创建Singleton实例,可能会导致创建多个对象。为了保证线程安全,通常需要在`Instance()`方法中添加互斥锁(`mutex`)或者使用原子操作(`std::atomic`)。...
【Java并行(4):线程安全前传之Singleton1】 在Java编程中,Singleton设计模式是一种常用的设计模式,它的主要目标是确保一个类只有一个实例,并提供一个全局访问点。在多线程环境中,实现线程安全的Singleton至关...
为了进一步提高Singleton的安全性和线程安全性,可以考虑使用线程局部存储(TLS)或互斥锁(mutex)。在多线程环境中,如果没有适当的同步机制,`getInstance()`可能会在不同线程中同时创建多个实例。在C++11及更高...
这种方式是线程安全的,且只在Singleton类加载时初始化Singleton实例,因此既解决了懒加载,又避免了同步问题。 ```java public class Singleton { private Singleton() {} private static class Singleton...
这种方式非线程安全,但在Java 1.5后可以通过`synchronized`关键字保证线程安全。 ```java public class Singleton { private static Singleton instance; private Singleton() {} public synchronized ...
1. **singleton(单例)**:这是默认的scope,每个容器中只有一个实例。无论多少次请求这个Bean,Spring都会返回同一个对象。在`WebContent/WEB-INF/spring/appServlet/servlet-context.xml`或`src/main/resources/...
Singleton保证了线程安全性,减少了内存消耗,但可能不适合有状态的对象。而Prototype则提供了更大的灵活性,允许每个依赖有其独立的状态,但可能会增加内存开销并可能导致并发问题,因此需要谨慎处理。 此外,...
总结起来,多线程下的Singleton设计需要考虑线程安全问题,通过如双重检查锁定、静态内部类或枚举等方式实现线程安全的单例模式。同时,要注意单例模式可能带来的潜在问题,并根据实际情况选择合适的设计策略。
- 配置Prototype Bean的例子是:`<bean id="role" class="spring.chapter2.maryGame.Role" scope="prototype"/>` 或 `<bean id="role" class="spring.chapter2.maryGame.Role" singleton="false"/>` 3. **Request...
1. 饿汉式单例:在类加载时就完成了实例化,线程安全,但可能造成不必要的资源浪费。 ```cpp class Singleton { public: static Singleton& getInstance() { return instance; } private: Singleton() {} ...
其中,singleton和prototype是两个最基本的bean作用域。本文将详细介绍Spring中的singleton和prototype的实现,通过示例代码和测试结果,帮助读者深入理解这两种bean作用域。 Singleton Singleton模式是Spring...