网易首页 > 网易号 > 正文 申请入驻

【081期】面试官问:Spring 创建好的单例对象存在线程安全问题吗?

0
分享至

点击上方“Java精选”,选择“设为星标”

别问别人为什么,多问自己凭什么!

下方留言必回,有问必答!

每天08:00更新文章,每天进步一点点...

前言

这是我在一次面试中被问到过的问题,但是当时我回答的并不是太好,最近在学习多线程知识的时候又对这个问题有了新的理解,所以这篇文章主要讲解下我对个问题的理解。

正文 一、理解这个问题前,你需要先知道几个知识点

1.spring的bean作用域都有哪些?默认是哪个?

默认的是:单例 singleton

2.创建单例的方式是否线程安全与使用已经创建好的单例对象是否线程安全是两个问题

①常见创建单例的方式懒汉式和饿汉式

懒汉式(不安全写法)

public class Singleton{
private Singleton(){}
private static Singleton singleton = null; //不建立对象
public static Singleton getInstance(){
if(singleton == null) { //先判断是否为空
singleton = new Singleton (); //懒汉式做法
return singleton ;

饿汉式

public class Singleton{
public Singleton(){}
private static Singleton singleton = new Singleton(); //建立对象
public static Singleton getInstance(){
return singleton ;//直接返回单例对象 }}

懒汉式(安全写法)

public class Singleton{
private Singleton(){}
private static Singleton singleton = null; //不建立对象
public static synchronized Singleton getInstance(){
if(singleton == null) { //先判断是否为空
singleton = new Singleton (); //懒汉式做法
return singleton ;

②在spring的框架里,对象是交给spring容器创建的,spring的创建单例的方式既不是懒汉式也不是饿汉式,是单例注册表模式实现单例模式的,感兴趣的可以看这篇文章:https://blog.csdn.net/u012794505/article/details/80926823,这种创建单例模式的方式是线程安全的。

③怎么判断使用已经创建好的单例对象是否线程安全

  • 看这个单例里有没有全局变量(全局变量就是成员变量,成员变量又分实例变量和静态变量)

  • 如果有全局变量,看它是不是只可以读取而不能写入(有没有发布set方法)

如果满足上面两个条件,那么这个单例就是不安全的。

二、spring的单例模式与线程安全

2.其实spring的源码里比如RequestContextHolderTransactionSynchronizationManagerLoxaleContextHolder等这些对象创建方式也是单例,底层就是用ThreadLocal处理的。ThreadLocal基本实现思路是:它会为每个线程提供一个独立的变量副本,从而隔离了多个线程对数据的访问冲突,因为每个线程都拥有自己的变量副本,从而也就没必要对该变量进行同步啦。

3.在ssh或ssm框架里的service或dao对象虽然也是单例模式,但正如上面分析的,他们没有可修改的全局变量,所以在多线程环境下也是安全的。

4.其实在很多文章中对于spring的单例模式与线程安全会提到一个概念有状态对象和无状态对象,无状态对象在多线程环境下是线程安全的,有状态的对象则不是,其实这个字面的意思是比较对的,因为这个对象如果无法存储数据,也就不会出现多个线程操作共享数据的情况,自然安全,概念如下

有状态就是有数据存储功能。有状态对象(Stateful Bean),就是有实例变量的对象,可以保存数据,是非线程安全的。在不同方法调用间不保留任何状态。公众号Java精选,回复Java面试,免费在线刷题。

无状态就是一次操作,不能保存数据。无状态对象(Stateless Bean),就是没有实例变量的对象.不能保存数据,是不变类,是线程安全的。

但是很多文章举的无状态对象的例子我认为不合理。比如:https://blog.csdn.net/bingjing12345/article/details/9794945,因为如果这个对象没有set放方法只是可读,其实也是安全的。

public class StatefulBean {

public int state;
// 由于多线程环境下,user是引用对象,是非线程安全的
public User user;

public int getState() {
return state;
}

public void setState(int state) {
this.state = state;
}

public User getUser() {
return user;
}

public void setUser(User user) {
this.user = user;
}
}
总结

其实你越去了解框架底层的实现原理,你越会为这个框架的思想而着迷,你会感慨框架笔者的想法是多么的奇妙,多么的周全,多一字嫌多,少一字嫌少。

作者:开心的码字达 blog.csdn.net/jdk_wangtaida/article/details/88738228

期往精选 点击标题可跳转

- 小程序,3000+ 道面试题在线刷,最新、最全 Java 面试题!

文章有帮助的话,在看,转发吧!

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
2024年乐透出炉:开拓者雷霆捡漏 周志豪逆袭 两前三热门大幅下滑

2024年乐透出炉:开拓者雷霆捡漏 周志豪逆袭 两前三热门大幅下滑

颜小白的篮球梦
2024-06-27 09:43:55
同积4分!比利时0-0乌克兰小组第二出线 乌克兰同分第4出局

同积4分!比利时0-0乌克兰小组第二出线 乌克兰同分第4出局

直播吧
2024-06-27 02:04:43
董事长下跪后,百亿房企石榴集团凌晨发声明,股东“内讧”仍在继续

董事长下跪后,百亿房企石榴集团凌晨发声明,股东“内讧”仍在继续

红星新闻
2024-06-26 17:02:14
08年,汶川地震22岁女孩被40岁大叔救下,以身相许,后来幸福吗?

08年,汶川地震22岁女孩被40岁大叔救下,以身相许,后来幸福吗?

百年历史老号
2024-06-26 09:23:40
外国网友看嫦娥六号返乡,这一次评论区,韩国网友集体破防了

外国网友看嫦娥六号返乡,这一次评论区,韩国网友集体破防了

史说新风
2024-06-26 16:01:17
御姐风!太高级!要不起的感觉

御姐风!太高级!要不起的感觉

梧州生活宝
2024-05-22 23:14:03
原国家测绘地理信息局法规与行业管理司司长王保立被查

原国家测绘地理信息局法规与行业管理司司长王保立被查

新京报
2024-06-27 09:42:09
《中餐厅》虞书欣“生图”辣眼,网友:能不能身材和仪态管理一下

《中餐厅》虞书欣“生图”辣眼,网友:能不能身材和仪态管理一下

喵喵娱乐团
2024-06-26 15:30:22
都世界第一了,为啥不能对员工好点?

都世界第一了,为啥不能对员工好点?

七叔东山再起
2024-06-26 21:41:32
台军持续挑衅,台前舰长提醒意味深长:当年可没跟大陆签停战协议

台军持续挑衅,台前舰长提醒意味深长:当年可没跟大陆签停战协议

全民历史观
2024-06-26 09:44:06
65岁大爷肾衰竭去世,生前饮食清淡爱运动,子女:都是他自找的!

65岁大爷肾衰竭去世,生前饮食清淡爱运动,子女:都是他自找的!

碧晴养生汇
2024-06-26 09:55:46
苹果新品上架,仅售 1299 元

苹果新品上架,仅售 1299 元

果粉俱乐部
2024-06-26 11:54:48
蜜雪冰城新品因味道太像脚臭遭疯抢?大伙的XP别太离谱……

蜜雪冰城新品因味道太像脚臭遭疯抢?大伙的XP别太离谱……

记录生活日常阿蜴
2024-06-25 19:08:20
外交部驳斥伯恩斯涉华言论

外交部驳斥伯恩斯涉华言论

新京报政事儿
2024-06-26 17:38:10
斯玛特:理解被交易 但我也是人 希望提前接到电话而不是措手不及

斯玛特:理解被交易 但我也是人 希望提前接到电话而不是措手不及

直播吧
2024-06-26 20:01:12
职称倒查拉开序幕!审查年限见前所未见,六年之前的照样查!

职称倒查拉开序幕!审查年限见前所未见,六年之前的照样查!

猫小狸同学
2024-05-06 20:20:07
深中通道通车后,预测车流量为8万至10万辆/天,日收入超500万?

深中通道通车后,预测车流量为8万至10万辆/天,日收入超500万?

平祥生活日志
2024-06-27 01:36:22
马克·吕特成北约新秘书长,凶悍小娘子接班博雷利:普京很不高兴

马克·吕特成北约新秘书长,凶悍小娘子接班博雷利:普京很不高兴

鹰眼Defence
2024-06-26 11:08:05
玫瑰的哥哥黄振华为什么他的父母连个房子都不给他买呢?

玫瑰的哥哥黄振华为什么他的父母连个房子都不给他买呢?

乐观探历史
2024-06-25 19:59:00
朝鲜强烈谴责!

朝鲜强烈谴责!

鲁中晨报
2024-06-24 22:35:07
2024-06-27 12:04:49
Java精选
Java精选
一场永远也演不完的戏
1551文章数 3855关注度
往期回顾 全部

科技要闻

朱啸虎:5年后将没有独立的大模型公司存在

头条要闻

李雪琴高考分数遭质疑 北大同学发声晒出其高考成绩

头条要闻

李雪琴高考分数遭质疑 北大同学发声晒出其高考成绩

体育要闻

和布朗尼一样菜的人,咋进NBA?

娱乐要闻

李雪琴北大学历情况被扒,牵扯多人

财经要闻

曹远征:不能被"产能过剩"的概念所困惑

汽车要闻

32万公里实车直播拆解 极氪凭事实证明实力!

态度原创

亲子
艺术
数码
本地
公开课

亲子要闻

好聪明的宝宝,还不会说话,但沟通句句有回应

艺术要闻

穿越时空的艺术:《马可·波罗》AI沉浸影片探索人类文明

数码要闻

降低游戏容量和显存占用,AMD 预告下月演示 AI 纹理压缩技术

本地新闻

冷知识:东北雪糕才是最早的网红雪糕

公开课

连中三元是哪三元?

无障碍浏览 进入关怀版