spring框架中的单例Beans是线程安全的么?
看到这样一个问题: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来获取也是不错的方法。
真正出现上面代码问题的也是少数,出现的时候,一般是为了图方便,一个很多方法都要用到的变量,如果都需要用参数的
方式传递多麻烦呀,这样私有变量多好,不用参数那样丑陋。但是丑陋并不代表不好,以对的,自己习惯的方式编程,才能
尽量避免问题的发生。
spring框架中的单例Beans是线程安全的么?相关推荐
- Spring框架中的单例Beans是线程安全的么
看到这样一个问题:Spring框架中的单例Beans是线程安全的么? Spring框架并没有对单例bean进行任何多线程的封装处理.关于单例bean的线程安全和并发问题需要开发者自行去搞定.但实际上, ...
- Spring 框架中的单例Beans 是线程安全的么?
Spring 框架并没有对单例bean 进行任何多线程的封装处理.关于单例bean 的线程安全和并发问题需要开发者自行去搞定.但实际上,大部分的Spring bean 并没有可变的状态(比如Servi ...
- Spring框架中的单例Bean是线程安全的吗?
首先直接给出答案:不是线程安全的 一.分析问题 证明不是线程安全的案例如下: public class Student {private String stuName;public String re ...
- Spring框架中的单例Bean是线程安全的么?
答: 不是安全的. Spring中的Bean默认是单例模式的,框架并没有对bean进行多线程的封装处理. 注:单例bean是指IOC容器中就只有这么一个bean,是全局共享的,有多少个线程来访问用的都 ...
- Spring框架中的单例Bean是线程安全的吗
Sp
- 面试官:Spring创建好的单例对象存在线程安全问题吗?
点击关注公众号,实用技术文章及时了解 来源:blog.csdn.net/jdk_wangtaida/ article/details/88738228 前言 这是我在一次面试中被问到过的问题,但是当时 ...
- Spring容器中 singleton 单例、 prototype多例
项目开发中通常会使用:singleton 单例. prototype多例 Singleton: 在一个spring容器中,对象只有一个实例.(默认值) Prototype: 在一个spring容器中, ...
- Spring框架中的设计模式(四)
适配器 当我们需要在给定场景下(也就是给定接口)想要不改变自身行为而又想做到一些事情的情况下(就是我给电也就是接口了,你来做事也就是各种电器),使用适配器设计模式(这里再说一点,就相当于我们再一个规章 ...
- 结合Spring源码学习单例设计模式
之前我学习了 Spring Ioc,明白了 Spring IoC 容器是一个管理Bean的容器,在Spring的定义中,它要求所有的IoC容器都需要实现接口 BeanFactory ,它是一个顶级容器 ...
最新文章
- 跨平台抓包软件,可以替代Fiddler
- 美国没有光刻机背后的原因
- 1049-飞机最少换乘次数问题
- agg::rendering_buffer 渲染缓存
- mysql5.1编译安装centos7_CentOS7下 Nginx1.13.5 + PHP7.1.10 + MySQL5.7.19 源码编译安装
- C++之(pair)用法总结
- ajax成功跨域_自己写的
- arraylist扩容是创建新数组吗 java_Java集合干货——ArrayList源码分析
- php ci的session和php session,php及codeigniter使用session-cookie的方法(详解)
- ASCII码16进制对照表
- Webmax 2.0开启无限量下载
- sklearn 5.18.3 SGD - Maximum margin separating hyperplane
- kodexplor类似php,Windows 下搭建 PHP + Nginx + KODExplorer
- 二叉树给我的人生感悟
- JavaWeb综合案例——商品后台管理系统
- mybatis官方文档中文版
- 异常收集 ----雨之殇
- STM32F1模拟iic的GPIO配置(小总结)
- 1.9Hadoop插件
- 2020年下半年教师资格证报名要注意这些问题!