`
squall140
  • 浏览: 146253 次
  • 性别: Icon_minigender_1
  • 来自: 天津
社区版块
存档分类
最新评论

Spring线程安全

阅读更多

Spring管理的对象基本都应该是无状态的  ,spring单例 线程安全

 

 Spring 容器中的  Bean  也是运行于多线程的环境下。在绝大多数情况下, Spring  的  Bean  都是单实例的( singleton ),单实例  Bean  的最大的好处是线程无关性,不存在多线程并发访问的问题,也即是线程安全的。  

 

Spring DAO 模板类并未采用线程同步机制,因为线程同步限制了并发访问,会带来很大的性能损失。  

 

ThreadLocal Spring 中发挥着重要的作用,在管理 request 作用域的 Bean 、事务管理、任务调度、 AOP 等模块都出现了它们的身影,起着举足轻重的作用  

 

当使用ThreadLocal 维护变量时, ThreadLocal 为每个使用该变量的线程提供独立的变量副本,所以每一个线程都可以 独立地改变自己的副本,而不会影响其它线程所对应的副本。

 

ThreadLocal是如何做到为每一个线程维护变量的副本的呢?其实实现的思路很简单:在 ThreadLocal 类中有一个 Map ,用于存储每一个线程的变量副本, Map 中元素的键为线程对象,而值对应线程的变量副本。  

 

Spring使用 ThreadLocal 解决线程安全问题

我们知道在一般情况下,只有无状态的Bean 才可以在多线程环境下共享,在 Spring 中,绝大部分 Bean 都可以声明为 singleton 作用域。就是因为 Spring 对一些 Bean (如 RequestContextHolder TransactionSynchronizationManager LocaleContextHolder 等)中非线程安全状态采用 ThreadLocal 进行处理,让它们也成为线程安全的状态,因为有状态的 Bean 就可以在多线程中共享了。

 

 

singleton作用域

当一个bean 的作用域设置为 singleton ,那么 Spring IOC 容器中只会存在一个共享的 bean 实例,并且所有对 bean 的请求,只要 id 与该 bean 定义相匹配,则只会返回 bean 的同一实例。换言之,当把一个 bean 定义设置为 singleton 作用域时, Spring IOC 容器只会创建该 bean 定义的唯一实例。这个单一实例会被存储到单例缓存( singleton cache )中,并且所有针对该 bean 的后续请求和引用都将返回被缓存的对象实例,这里要注意的是 singleton 作用域和 GOF 设计模式中的单例是完全不同的,单例设计模式表示一个 ClassLoader 中只有一个 class 存在,而这里的 singleton 则表示一个容器对应一个 bean ,也就是说当一个 bean 被标识为 singleton 时候, spring IOC 容器中只会存在一个该 bean

配置实例:


<bean id="role" class="spring.chapter2.maryGame.Role" scope="singleton"/>

或者


<bean id="role" class="spring.chapter2.maryGame.Role" singleton="true"/>

分享到:
评论

相关推荐

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

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

    线程中获取spring 注解bean

    这样,每个线程都有其独立的bean副本,避免了线程安全问题。但需要注意,使用完后记得清理ThreadLocal变量,防止内存泄漏。 2. **AOP(面向切面编程)**:通过Spring AOP,可以在特定的切点(如方法调用)执行拦截...

    Synchronized锁在Spring事务管理下线程不安全

    Synchronized锁在Spring事务管理下,导致线程不安全。

    spring 多线程队列执行

    Spring提供了一些工具类如`ConcurrentHashMap`、`AtomicInteger`等,它们具有内置的线程安全机制。此外,合理设计并发控制策略,如使用`synchronized`关键字或`Lock`接口,也是确保数据一致性的重要手段。 7. **...

    基于Spring+Ibatis的安全线程实现

    2. **单例Bean的线程安全**:Spring默认的Bean作用域为单例,如果Bean不是无状态的,即其内部包含共享状态,那么需要谨慎处理线程安全问题。通常,我们可以通过将有状态Bean改为原型作用域,或者使用AOP在方法级别...

    spring单例引起的线程安全问题

    【Spring 单例模式与线程安全】 在 Spring 框架中,bean 的实例化策略分为两种:单例(Singleton)和多例(Prototype)。单例模式意味着在整个 Spring 容器中,对于一个给定的 bean 定义,只会存在一个实例。这通常...

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

    ### Struts1、Struts2、WebWork框架中的线程安全问题分析 #### 一、Struts1与线程安全问题 在Struts1中,每个`Action`类实例是被多个请求重用的,这使得它在多线程环境下存在潜在的线程安全问题。当多个线程同时...

    Spring并发访问的线程安全性问题.docx

    在Spring MVC中,...总之,理解并处理Spring MVC中的线程安全问题是开发高并发Web应用的关键。合理的架构设计、避免实例变量、使用线程安全的数据结构以及合理配置bean的生命周期,都能帮助我们构建更健壮的系统。

    java中spring里实现多线程

    在实际项目中,我们还需要关注线程安全问题,比如同步机制(synchronized关键字、Lock接口)、线程间通信(wait、notify、Condition)以及并发工具类(ConcurrentHashMap、CountDownLatch、CyclicBarrier、Semaphore...

    spring4+junit4.8 +多线程TheadTool

    Spring4提供了多种方式保证线程安全,如使用`@Scope("prototype")`创建单个请求的bean实例,或者使用`@Transactional`注解实现事务管理,保证数据一致性。 5. **并发编程**:Java的并发库提供了丰富的工具,如`java...

    开发线程安全的SpringWeb应用-pdf清晰

    教你怎么开发线程安全的SpringWeb应用.

    基于SSM和VUE的多线程与线程安全实践

    为了解决这些问题,我们开发了一个基于SSM(Spring、Spring MVC、MyBatis)和VUE的多线程与线程安全实践项目。 本项目旨在通过实际案例演示多线程的应用及其带来的性能提升,同时深入探讨如何在多线程环境中保证...

    唤醒阻塞休眠线程示例

    在多线程编程中,线程的控制与协作是至关重要的。...通过这些方法,我们可以确保线程安全、高效地执行,避免数据不一致和系统资源的浪费。在处理线程时,应当优先考虑协作而非强制终止,以保持程序的稳定性和可维护性。

    aop实战.rar

    4. **Spring线程安全**:文档可能会讨论Spring中的bean是否线程安全,以及如何在AOP的帮助下确保线程安全,例如使用ThreadLocal或者在通知中添加同步控制。 5. **从Redis缓存中获取数据**:AOP可以用来增强方法,...

    Java 单例模式线程安全问题

    为了确保线程安全,Spring 使用 ThreadLocal 来处理一些非线程安全的状态。例如,RequestContextHolder、TransactionSynchronizationManager、LocaleContextHolder 等 Bean 都使用 ThreadLocal 来处理非线程安全的...

    Spring Security 安全管理

    - **SecurityContextHolder**:这是一个上下文持有者,用于存储当前线程的安全上下文信息,即当前用户的认证信息。它是 Spring Security 提供的全局访问点,可以在任何地方获取当前用户的认证状态。 - **...

Global site tag (gtag.js) - Google Analytics