看到这样一个问题:spring框架中的单例Beans是线程安全的么?

Spring框架并没有对单例bean进行任何多线程的封装处理。关于单例bean的线程安全和并发问题需要开发者自行去搞定。但实际上,大部分的Spring bean并没有可变的状态(比如Serview类和DAO类),所以在某种程度上说Spring的单例bean是线程安全的。如果你的bean有多种状态的话(比如 View Model 对象),就需要自行保证线程安全。

最浅显的解决办法就是将多态bean的作用域由“singleton”变更为“prototype”。

没太看懂有状态和无状态的bean是什么意思,于是百度之,获益匪浅。

在Spring的Bean配置中,存在这样两种情况:

<bean id="testManager" class="com.sw.TestManagerImpl" scope="singleton" />  <bean id="testManager" class="com.sw.TestManagerImpl" scope="prototype" /> 

当然,scope的值不止这两种,还包括了request,session 等。但用的最多的还是singleton单态,prototype多态。

singleton表示该bean全局只有一个实例,Spring中bean的scope默认也是singleton.

prototype表示该bean在每次被注入的时候,都要重新创建一个实例,这种情况适用于有状态的Bean.

对于SSH架构的系统,很少关心这方面,因为我们用到的一般都是singleton. Bean的注入由Spring管理。

对于有状态的Bean呢?

下面是一个有状态的Bean

package com.sw;  public class TestManagerImpl implements TestManager{  private User user;    public void deleteUser(User e) throws Exception {  user = e ;           //1  prepareData(e);  }  public void prepareData(User e) throws Exception {  user = getUserByID(e.getId());            //2  .....  //使用user.getId();                       //3  .....  .....  }
}  

如果该Bean配置为singleton,会出现什么样的状况呢?

如果有2个用户访问,都调用到了该Bean.

假定为user1,user2

当user1 调用到程序中的1步骤的时候,该Bean的私有变量user被付值为user1

当user1的程序走到2步骤的时候,该Bean的私有变量user被重新付值为user1_create

理想的状况,当user1走到3步骤的时候,私有变量user应该为user1_create;

但如果在user1调用到3步骤之前,user2开始运行到了1步骤了,由于单态的资源共享,则私有变量user被修改为user2

这种情况下,user1的步骤3用到的user.getId()实际用到是user2的对象。

而如果是prototype的话,就不会出现资源共享的问题。

对于SSH来说,Bean的配置是没错的,配置为singleton ;实际应该是这个例子不应该用私有变量。这样就使得这个Bean

由无状态变成了有状态Bean.还是应该尽量使用无状态Bean.如果在程序中出现私有变量,尽量替换为参数。
对于每个访问私有变量的方法增加变量传入或者通过ThreadLocal来获取也是不错的方法。

真正出现上面代码问题的也是少数,出现的时候,一般是为了图方便,一个很多方法都要用到的变量,如果都需要用参数的

方式传递多麻烦呀,这样私有变量多好,不用参数那样丑陋。但是丑陋并不代表不好,以对的,自己习惯的方式编程,才能

尽量避免问题的发生。

作者:王中秋
出处:http://www.cnblogs.com/wangzhongqiu/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.

spring框架中的单例Beans是线程安全的么?相关推荐

  1. Spring框架中的单例Beans是线程安全的么

    看到这样一个问题:Spring框架中的单例Beans是线程安全的么? Spring框架并没有对单例bean进行任何多线程的封装处理.关于单例bean的线程安全和并发问题需要开发者自行去搞定.但实际上, ...

  2. Spring 框架中的单例Beans 是线程安全的么?

    Spring 框架并没有对单例bean 进行任何多线程的封装处理.关于单例bean 的线程安全和并发问题需要开发者自行去搞定.但实际上,大部分的Spring bean 并没有可变的状态(比如Servi ...

  3. Spring框架中的单例Bean是线程安全的吗?

    首先直接给出答案:不是线程安全的 一.分析问题 证明不是线程安全的案例如下: public class Student {private String stuName;public String re ...

  4. Spring框架中的单例Bean是线程安全的么?

    答: 不是安全的. Spring中的Bean默认是单例模式的,框架并没有对bean进行多线程的封装处理. 注:单例bean是指IOC容器中就只有这么一个bean,是全局共享的,有多少个线程来访问用的都 ...

  5. Spring框架中的单例Bean是线程安全的吗

    Sp

  6. 面试官:Spring创建好的单例对象存在线程安全问题吗?

    点击关注公众号,实用技术文章及时了解 来源:blog.csdn.net/jdk_wangtaida/ article/details/88738228 前言 这是我在一次面试中被问到过的问题,但是当时 ...

  7. Spring容器中 singleton 单例、 prototype多例

    项目开发中通常会使用:singleton 单例. prototype多例 Singleton: 在一个spring容器中,对象只有一个实例.(默认值) Prototype: 在一个spring容器中, ...

  8. Spring框架中的设计模式(四)

    适配器 当我们需要在给定场景下(也就是给定接口)想要不改变自身行为而又想做到一些事情的情况下(就是我给电也就是接口了,你来做事也就是各种电器),使用适配器设计模式(这里再说一点,就相当于我们再一个规章 ...

  9. 结合Spring源码学习单例设计模式

    之前我学习了 Spring Ioc,明白了 Spring IoC 容器是一个管理Bean的容器,在Spring的定义中,它要求所有的IoC容器都需要实现接口 BeanFactory ,它是一个顶级容器 ...

最新文章

  1. 跨平台抓包软件,可以替代Fiddler
  2. 美国没有光刻机背后的原因
  3. 1049-飞机最少换乘次数问题
  4. agg::rendering_buffer 渲染缓存
  5. mysql5.1编译安装centos7_CentOS7下 Nginx1.13.5 + PHP7.1.10 + MySQL5.7.19 源码编译安装
  6. C++之(pair)用法总结
  7. ajax成功跨域_自己写的
  8. arraylist扩容是创建新数组吗 java_Java集合干货——ArrayList源码分析
  9. php ci的session和php session,php及codeigniter使用session-cookie的方法(详解)
  10. ASCII码16进制对照表
  11. Webmax 2.0开启无限量下载
  12. sklearn 5.18.3 SGD - Maximum margin separating hyperplane
  13. kodexplor类似php,Windows 下搭建 PHP + Nginx + KODExplorer
  14. 二叉树给我的人生感悟
  15. JavaWeb综合案例——商品后台管理系统
  16. mybatis官方文档中文版
  17. 异常收集 ----雨之殇
  18. STM32F1模拟iic的GPIO配置(小总结)
  19. 1.9Hadoop插件
  20. 2020年下半年教师资格证报名要注意这些问题!

热门文章

  1. adguard和adblock哪个好_世界上最高级的广告拦截程序AdGuard过滤规则分享
  2. 人脸识别:特征脸(Eigenface)
  3. android 设置音效EQ
  4. 评论区抽奖程序2.0
  5. 霍夫曼树(赫夫曼树、哈夫曼树)
  6. uniapp获取手机App权限
  7. 杭州住房公积金提取说明
  8. IMPERVA - WAF syslog配置及注意事项
  9. Word中的公式编辑器插入自动编号公式时,隐藏必要的分章节字符串的办法
  10. 英特尔 超核芯显卡 620mac_显卡性能翻倍,AI能力加持:英特尔发布10代酷睿处理器...