zoukankan      html  css  js  c++  java
  • Spring的线程安全

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

     

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

     

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

     

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

     

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

     

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

     

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

    我们知道在一般情况下,只有无状态的Bean才可以在多线程环境下共享,在Spring中,绝大部分Bean都可以声明为singleton作用域。就是因为Spring对一些Bean(如RequestContextHolderTransactionSynchronizationManagerLocaleContextHolder等)中非线程安全状态采用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时候,springIOC容器中只会存在一个该bean

    配置实例:

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

    或者

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

  • 相关阅读:
    数以百万计美元的融资YO是什么东东?
    工作流和审批流
    Linux makefile 教程 很具体,且易懂
    【吐槽】火车票一票难求啊
    poj 2828 Buy Tickets(树状数组 | 线段树)
    如花搞笑图片集锦(转贴)
    苹果开发人员账号注冊流程
    优秀团队建设--美国式团队(ppt)
    屏幕分辨率(QQVGA、QVGA、VGA、XGA、WXGA、WUXGA和WSXGA+)
    怎样设计接口?
  • 原文地址:https://www.cnblogs.com/heartstage/p/3363698.html
Copyright © 2011-2022 走看看