注:本篇是对Spring注入单例模式问题的补充
上篇文章已对问题进行详细描述。所以本篇只介绍另一个相关问题。
由于全局变量的使用,再加上Spring的单例模式,该变量就相当于一个单例类,任何线程进来对其的修改都会在其他线程的处理中体现。大部分情况下该情况都会在clear的处理下保存数据不混乱。但是该clear是在两个前提下才有用的,即A线程进来处理完成,B线程才进来处理。或者说是A线程处理中对该全局变量的修改不会实时的同步到静态存储区中去,在A线程处理完成前A对全局变量的修改结果不会体现在其他线程的处理中。由于使用全局变量是前人写的方案进行的处理,所以后来者看到这种写法时都奉行了一个原则 - - - 天下代码一大抄!
那么问题来了!当本人接触新需求时,很明显也沿用了之前的处理方法。而且想当然的认为是这样的原理:即A线程进来时获取的只是该全局变量(对象)的一个镜像缓存,修改的也是该缓存,只有当A线程处理完后才会提交该缓存,然后才会影响到静态存储区的值。这也就应正了上面的第二个前提。然而事实并非如此。有爱思索又上进的同事觉得这样的处理方法有问题,过来问了我。当时看了一下自己的代码依稀记得之前是测试过的,然后解释时认为获取的就是对象的一个镜像。再后来闲下来又测才发现居然是实时修改的,也就是说获取的并不是该全局变量的一个镜像。然后就发现如果出现并发问题,A线程在处理中,B线程进来把数据修改了,那么A中的处理就有可能用了B请求的数据。指不定出什么幺蛾子。于是呼,报请领导,又一番测试,毙了老方案,提了一个新方案,把那些全局变量改成局部变量。还好生产环境中用这种模式的功能并发不太大,而且公司服务器性能还阔以,没造成大的损失。
到此算是告一段落。但是关于获取对象镜像的情况仍需再了解。
相关推荐
单例模式是软件设计模式中的一种经典模式,用于确保一个类只有一个实例,并提供一个全局访问点。这种模式在很多场景下都非常有用,比如控制数据库连接、管理缓存或者全局配置等。下面我们将详细探讨单例模式的七种...
2. 如何理解和使用volatile关键字在单例模式中的作用? 3. Spring框架如何处理并发环境下单例对象的创建和管理? 4. 如何通过反射或序列化破坏单例模式的唯一性,以及如何防御? 5. 如何在保证单例模式的同时,增加...
单例模式是软件设计模式中的一种经典模式,它在许多实际场景中被广泛使用,尤其在需要...同时,随着编程语言和框架的发展,如Spring框架中的依赖注入,有时可以避免使用单例模式,通过更灵活的方式管理对象的生命周期。
在Spring框架中,Bean默认就是单例模式,Spring会管理Bean的生命周期和实例化过程,提供依赖注入等高级功能。 总结来说,单例模式是一种重要的设计模式,用于控制类的实例化过程,保证全局只有一个实例。不同的实现...
在某些场景下,如依赖注入和Spring框架中,推荐使用更灵活的策略模式来替代传统的单例。 总的来说,单例模式是一种重要的设计模式,尤其在资源管理和跨组件通信中发挥着关键作用。理解并熟练掌握单例模式,对于提升...
随着技术的发展,现代框架如Spring MVC提供了更全面的MVC支持,简化了开发过程,同时也提供了更多设计模式的集成,如依赖注入(Dependency Injection)和面向切面编程(Aspect-Oriented Programming)。 总之,MVC...
替代单例模式的解决方案可以考虑依赖注入框架,它们可以控制对象的生命周期和依赖关系,避免了单例模式的缺点,同时提供了更好的可测试性和灵活性。例如,Spring框架中的`@ Singleton`注解,可以在容器管理组件时...
依赖注入(Dependency Injection,简称DI)是一种设计模式,它允许组件之间通过外部源来管理其依赖关系,而不是由组件自己来创建或查找依赖。Spring框架提供了两种主要的DI方式:构造器注入和setter注入。 1. **...
总的来说,Spring通过工厂模式和单例模式实现了bean的高效管理,依赖注入机制则使得代码更加灵活和解耦,提高了组件的可测试性和可维护性。深入理解和熟练运用这些概念,将有助于提升开发效率和软件质量。
7. **单例Bean的缓存**:对于单例模式的Bean,Spring会将其缓存,后续请求相同Bean时,直接返回缓存的实例,避免重复创建。 8. **生命周期管理**:Spring提供了多种生命周期接口,如InitializingBean、...
2. **单例模式的实现方式** - **懒汉式**:延迟加载,只有在首次使用时才创建实例。这种方式在Java中需要注意线程安全问题,例如双重检查锁定(Double-Checked Locking)。 - **饿汉式**:类加载时就立即创建实例...
【Spring 单例模式与线程安全问题】 在 Spring 框架中,单例(Singleton)模式是一种常见的bean管理方式,意味着在整个Spring容器中,只有一个特定类的实例被创建并共享。默认情况下,所有 Spring 的bean 都是单例...
2. 单例模式:Spring支持单例Bean的创建,确保每个Bean只有一个实例。 3. 原型模式:Spring允许配置Bean为原型模式,每次请求都会创建新的实例。 4. 代理模式:Spring的AOP(面向切面编程)特性利用动态代理模式实现...
Spring的IoC容器则提供了更高级别的抽象,能够管理多个对象及其依赖关系,支持灵活的配置,并且可以方便地与其他设计模式结合使用,如策略模式、单例模式等。 在Spring中,我们可以通过XML配置文件或Java配置类来...
2. **单例模式**:默认情况下,Spring 中的 Bean 以单例形式存在。 3. **代理模式**:AOP 功能的核心实现之一,通过动态代理实现切面的功能。 4. **装饰者模式**:用于扩展现有功能而不修改原有代码。 5. **模板方法...
2. **单例模式**:Spring默认使用单例模式来管理Bean的实例,这意味着对于每一个Bean定义,Spring只会创建一个实例。 3. **代理模式**:AOP功能的实现中大量使用了代理模式,通过动态创建代理对象来实现切面逻辑的...
总之,Spring的Controller默认是单例模式,这要求我们在设计时考虑到线程安全问题。如果需要实例级的隔离,可以使用`@Scope("prototype")`注解。同时,利用最佳实践和设计模式,如依赖注入、ThreadLocal,可以帮助...
Spring框架广泛地应用了三种主要的Java设计模式:单例模式、工厂模式和代理模式。这些模式为Spring提供了灵活性、可扩展性和高效的资源管理。 首先,单例模式是Java编程中最常见的设计模式之一。它保证一个类只有一...