`
ME-XICAN
  • 浏览: 24057 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Spring注入单例模式问题2

阅读更多

注:本篇是对Spring注入单例模式问题的补充

上篇文章已对问题进行详细描述。所以本篇只介绍另一个相关问题。

    由于全局变量的使用,再加上Spring的单例模式,该变量就相当于一个单例类,任何线程进来对其的修改都会在其他线程的处理中体现。大部分情况下该情况都会在clear的处理下保存数据不混乱。但是该clear是在两个前提下才有用的,即A线程进来处理完成,B线程才进来处理。或者说是A线程处理中对该全局变量的修改不会实时的同步到静态存储区中去,在A线程处理完成前A对全局变量的修改结果不会体现在其他线程的处理中。由于使用全局变量是前人写的方案进行的处理,所以后来者看到这种写法时都奉行了一个原则 - - - 天下代码一大抄!

    那么问题来了!当本人接触新需求时,很明显也沿用了之前的处理方法。而且想当然的认为是这样的原理:即A线程进来时获取的只是该全局变量(对象)的一个镜像缓存,修改的也是该缓存,只有当A线程处理完后才会提交该缓存,然后才会影响到静态存储区的值。这也就应正了上面的第二个前提。然而事实并非如此。有爱思索又上进的同事觉得这样的处理方法有问题,过来问了我。当时看了一下自己的代码依稀记得之前是测试过的,然后解释时认为获取的就是对象的一个镜像。再后来闲下来又测才发现居然是实时修改的,也就是说获取的并不是该全局变量的一个镜像。然后就发现如果出现并发问题,A线程在处理中,B线程进来把数据修改了,那么A中的处理就有可能用了B请求的数据。指不定出什么幺蛾子。于是呼,报请领导,又一番测试,毙了老方案,提了一个新方案,把那些全局变量改成局部变量。还好生产环境中用这种模式的功能并发不太大,而且公司服务器性能还阔以,没造成大的损失。

    到此算是告一段落。但是关于获取对象镜像的情况仍需再了解。

分享到:
评论

相关推荐

    25个经典的Spring面试问答

    Spring框架中的单例Beans是线程安全的么 请举例说明如何在Spring中注入一个Java Collection 如何向Spring Bean中注入一个JavautilProperties 请解释Spring Bean的自动装配 请解释自动装配模式的区别 如何开启基于...

    吴天雄--Spring笔记.doc

    IOC详解,Spring环境搭建,Spring创建Bean的三种方式,scope属性详解(包含单例设计模式),DI详解,Spring的几种注入方式,利用Spring简化Mybatis;第二天内容:AOP(AOP常用概念、Spring的三种aop实现方式、代理...

    Spring.net实战开发

    IObjectFactory接口提供了一个简单而优雅的工厂模式,移除了对单例和一些服务定位stub的必要。允许你将真正的程序逻辑与配置解耦。作为对IObjectFactory 的扩展,IApplicationContext接口也在Spring.Core库中, ...

    Spring面试专题.pdf

    2、使用 Spring 框架能带来哪些好处? 3、什么是控制反转(IOC)?什么是依赖注入? 4、请解释下 Spring 框架中的 IoC? 5、BeanFactory 和 ApplicationContext 有什么区别? 6、Spring 有几种配置方式? 7、如何用...

    Spring面试题.zip

    2、使用 Spring 框架能带来哪些好处? 3、什么是控制反转(IOC)?什么是依赖注入? 4、请解释下 Spring 框架中的 IoC? 5、BeanFactory 和 ApplicationContext 有什么区别? 6、Spring 有几种配置方式? 7、如何用...

    spring.doc

    2 Spring的组成 6 2.1 Spring的jar包 6 2.2 Spring配置文件 7 2.3 Spring API 8 3 Spring基本功能详解 8 3.1 SpringIOC 8 3.2别名Alias 11 别名拓展: 11 3.3 Spring容器内部对象的创建 12 Spring容器内部对象创建...

    Spring-IOC::label:手写实现了Spring框架的基本功能,存在了注解以及xml配置,并且实现了引用注入等功能,还实现了SpringMVC的简单功能

    xml注入注解注入简单MVC功能注入支持递归注入属性注入引用注入(但未解决循环依赖)注解配置单例以及原型模式切换运用的设计模式工厂设计模式:Spring使用工厂模式通过BeanFactory,ApplicationContext创建bean对象...

    spring1.2学习心得分享

    (2)IoC概念 Inversion of Control 控制反转或控制转移 Don't Call Me,We will call you! 控制权:对象的创建和调用关系的控制. (3)DI概念 Dependecy Injection 依赖注入 Spring 使用DI技术实现了IoC控制。 ...

    初识Spring

    (1)用无参构造方法创建对象(2)用带参的构造方法创建对象(3)用静态工厂创建对象(4)用非静态工厂创建对象Spring的单例模式和多例模式Spring框架的依赖注入依赖注入简介依赖注入的类型:(1)setter方法注入:...

    Spring入门

    3、 提供单例模式支持,开发人员不再需要自己编写实现代码 4、Spring提供了众多服务。如:事务管理,编程人员不再需要手工控制事务,也不需处理复杂的事务传播 5、 Spring提供的众多辅助类,使用这些类能够加快应用...

    设计模式的代码样例

    系统通过spring框架注入的对象默认是单例的 配置文件在系统启动时去远端拉取,在后续使用时不需要再进行创建配置文件实例 实现方式 单例模式的实现通常有两种方式:“饿汉式”和“懒汉式”。 单例模式是将将构造...

    学习SSM源码分析的一次实践,自己实现SSM框架

    在spring中最核心的就是IOC容器,默认采用的是通过单例的模式来进行管理我们注入到Ioc中的bean(当然我们也是可以修改成其他的模式,暂且不讨论),在spring中单例模式是采用注册的方式来实现的单例模式,所以我也是...

    spring1.1开发理解

    (2)IoC概念 Inversion of Control 控制反转或控制转移 Don't Call Me,We will call you! 控制权:对象的创建和调用关系的控制. (3)DI概念 Dependecy Injection 依赖注入 Spring 使用DI技术实现了IoC控制。 ...

    Spring基础与快速入门

    4 依赖注入:建立对象与对象之间依赖关系的实现,包括接口注入、构造注入、set注入,在Spring中只支持后两种 5 AOP:面向方面编程,我们可以把日志、安全、事务管理等服务(或功能)理解成一个“方面”,那么以前...

    JAVA超全面试突击包-答案讲义

    涵含各种重要的JAVA编程知识点,面试突击专用 内容包括:Spring、SprngBoot、SpringCloud、Redis、MySQL、MyBatis、JVM、多...设计模式:包括常见的设计模式,如单例模式,工厂模式,观察者模式等,以及它们的使用场景

    MySSH.rarSSH框架,spring管理sessionFactory

    spring管理sessionFactory,将sessionFactory注入基础类,将基础类设置为单例模式,下载后直接部署使用,根据实体类自行建表

    spring学习心得

    (2)IoC概念 Inversion of Control 控制反转或控制转移 Don't Call Me,We will call you! 控制权:对象的创建和调用关系的控制. (3)DI概念 Dependecy Injection 依赖注入 Spring 使用DI技术实现了IoC控制。 ...

    Spring面试题

    3.容器提供单例模式支持 4.容器提供了AOP技术,利用它很容易实现如权限拦截,运行期监控等功能 5.容器提供了众多的辅助类,能加快应用的开发 6.spring对于主流的应用框架提供了集成支持,如hibernate,JPA,...

    Spring框架分为哪七大模块

    这里的基础概念是BeanFactory,它提供对Factory模式的经典实现来消除对程序性单例模式的需要,并真正地允许你从程序逻辑中分离出依赖关系和配置。 2.SpringContext: 构建于Core封装包基础上的Context封装包,提供了...

    xmljava系统源码-SpringInAction4:《SpringInAction4th》学习笔记

    holder”创建单例模式的理解,参考 Spring中单例的概念限于Spring上下文中,遵守约定 内部bean适用于setter注入和构造器注入,内部bean不能被复用 SpEL表达式 3. 高级装配 4 种自动装配 byName, byType, contructor, ...

Global site tag (gtag.js) - Google Analytics