最近有个同事去面试,其中有一个问题是关于spring单例的。本篇博文就发表一下小编我自己的理解~~。

使用过spring的程序猿应该都知道,我们的bean(controller、service和Dao,实体bean除外)都是通过spring的IoC

容器统一管理的,同时这些bean都是默认单例的,即一个bean在一个IoC容器中就只有一个实例。这一点跟设计模式中

的单例略有不同,在单例模式中的单例是在整个应用中只有一个实例。

我们把bean放在IOC容器中统一进行管理,只在初始化加载的时候实例化一次,一方面提高了效率,另一方面大大降

低了内存开销。spring的依赖反转原则降低了程序之间的耦合性,也提交了我们的开发效率,不用每次都手动去new

了。单例模式确实有很多优点,但是说到单例我们就会想到线程安全,并发访问情况下spring中bean是线程安全的吗?

到底是不是线程安全的,要根据实际场景判断。为什么这么说呢?首先,大多数时候客户端都在访问我们应用中

的业务对象,而这些业务对象并没有做线程的并发限制,因此不会出现各个线程之间的等待问题,或是死锁问题。这

一部分不在考虑。

再有就是成员变量这一重要因素了。在并发访问的时候这些成员变量将会是并发线程中的共享对象,也是影响线

程安全的重要因素。成员变量又分为基本类型的成员变量和引用类型的成员变量。

其中引用类型的成员变量即我们在controller中注入的service,在service中注入的dao,这里将其定义为成员变量主

要是为了实例化进而调用里面的业务方法,在这些类中一般不会有全局变量,因此只要我们的业务方法不含有独立的

全局变量即使是被多线程共享,也是线程安全的。

再有就是基本类型成员变量,刚刚说了service层和dao层一般不会有全局变量,这里主要针对于controller层。基本

类型成员变量的定义又分为两种情况:如果此成员变量是final类型修饰的不可被修改的,则仍是线程安全的。另外一

种情况就是不安全的了,解决方法:要么把全局变量定义成局部的, 要么修改controller的单例模式把它定义成

prototype类型的。从文中开始我们就提到过,实体bean不是单例的,并没有交给spring来管理,每次我们都手动去new

一个实例。从客户端传递到后台的controller-->service-->Dao,这一个流程中,即使处理我们提交数据的业务处理类是被

多线程共享的,但是他们处理的数据并不是共享的,数据是每一个线程都有自己的一份,所以在数据这个方面是不会

出现线程同步方面的问题的。

针对spring单例以上仅是个人意见,欢迎来探讨。

springIoc中的单列对象的分析的更多相关文章

  1. Ajax中的XMLHttpRequest对象详解

    XMLHttpRequest对象是Ajax技术的核心.在Internet Explorer 5中,XMLHttpRequest对象以ActiveX对象引入,被称之为XMLHTTP,它是一种支持异步请求 ...

  2. [百度空间] [转] 在 Visual C++ 中控制全局对象的初始化顺序

    from: http://blog.csdn.net/classfactory/archive/2004/08/07/68202.aspx 在 C++ 中,同一个翻译单位(.cpp文件)里的全局对象的 ...

  3. 详解JavaScript中的Object对象

    Object是在javascript中一个被我们经常使用的类型,而且JS中的所有对象都是继承自Object对象的.虽说我们平时只是简单地使用了Object对象来存储数据,并没有使用到太多其他功能,但是 ...

  4. Lucene中的 Query对象

    "Lucene中的 Query对象": 检 索前,需要对检索字符串进行分析,这是由queryparser来完成的.为了保证查询的正确性,最好用创建索引文件时同样的分析器. quer ...

  5. HQL查询——查询返回对象类型分析

    关于HQL查询,我们可以结合hibernate的API文档,重点围绕org.hibernate.Query接口,分析其方法,此接口的实例对象是通过通过session.对象的creatQuery(Str ...

  6. Java EE中的容器和注入分析,历史与未来

    Java EE中的容器和注入分析,历史与未来 java中的容器 java中的注入 容器和注入的历史和展望 一.java中的容器 java EE中的注入,使我们定义的对象能够获取对资源和其他依赖项的引用 ...

  7. IOS性能调优系列:使用Zombies动态分析内存中的僵尸对象

    硬广:<IOS性能调优系列>第四篇,预计会有二十多篇,持续更新,欢迎关注. 前两篇<IOS性能调优系列:Analyze静态分析>.<IOS性能调优系列:使用Instrum ...

  8. Java中arraylist和linkedlist源代码分析与性能比較

    Java中arraylist和linkedlist源代码分析与性能比較 1,简单介绍 在java开发中比較经常使用的数据结构是arraylist和linkedlist,本文主要从源代码角度分析arra ...

  9. R语言学习笔记1——R语言中的基本对象

    R语言,一种自由软件编程语言与操作环境,主要用于统计分析.绘图.数据挖掘.R本来是由来自新西兰奥克兰大学的Ross Ihaka和Robert Gentleman开发(也因此称为R),现在由“R开发核心 ...

随机推荐

  1. oracle中pl/sql 练习题----输入部门编号,在控制台打印这个部门的名称,总人数,平均工资(基本工资+奖金)

    一. 思路:声明record类型的变量,根据 多表联合查询查出想要的数据,最后输出. 二.注意:record类型不一定只是一个表中的数据,也可以声明不同表中的数据类型. 三.语句如下: declare ...

  2. 关于编码和解码问题——encode、decode

            一.背景和问题 近期在做一个关于声卡录音的项目,开发环境是win10 64位家庭中文版,pycharm2019.1,python3.6(Anaconda3),python模块pyaud ...

  3. Mol. Cell. Proteomics | 癌细胞衍生的小细胞外囊体通过促进HGF-Met途径促进受体细胞转移

    题目:Cancer cell derived small extracellular vesicles contribute to recipient cell metastasis through ...

  4. tomcat源码分析01-启动过程概览

    导读:tomcat是一个开源的web服务器,它实现了我们常用的Servlet,JSP,EL等相关规范,因为其性能稳定,开源等因素得到越来越多开发者的青睐,出于学习的目的,我决定研读其源码,并将阶段性成 ...

  5. python通过scapy编写arp扫描器

    多网卡的情况下发送二层包需要配置网卡 三层包不需要配置接口发包方法: sr() 发送三层数据包,等待接收一个或者多个数据包的响应 sr1() 发送三层数据包,只会接收一个数据包的响应 srp() 发送 ...

  6. [二分]codeforces 274A k-Multiple Free Set

    k-Multiple Free Set time limit per test 2 seconds memory limit per test 256 megabytes input standard ...

  7. sql-lib闯关31-40

    第三十一关 此关用WAF防护 和第三十关基本一样,在双引号后面添加括号进行闭合 语句可以有两种,?id=-1")union select 1,2,database() --+    或者   ...

  8. BZOJ 压力 tarjan 点双联通分量+树上差分+圆方树

    题意 如今,路由器和交换机构建起了互联网的骨架.处在互联网的骨干位置的核心路由器典型的要处理100Gbit/s的网络流量. 他们每天都生活在巨大的压力之下.小强建立了一个模型.这世界上有N个网络设备, ...

  9. OpenCV-Python 直方图-1:查找、绘制和分析 | 二十六

    目标 学会 使用OpenCV和Numpy函数查找直方图 使用OpenCV和Matplotlib函数绘制直方图 你将看到以下函数:cv.calcHist(),np.histogram()等. 理论 那么 ...

  10. ​知识图谱与机器学习 | KG入门 -- Part1 Data Fabric

    介绍 如果你在网上搜索机器学习,你会找到大约20500万个结果.确实是这样,但是要找到适合每个用例的描述或定义并不容易,然而会有一些非常棒的描述或定义.在这里,我将提出机器学习的另一种定义,重点介绍一 ...