controller、service、Dao是否是线程安全的?
admin
2024-02-02 22:36:56
0

我有个朋友最近面试被问到controller、service、Dao是否线程安全问题,只知道说线程安全的,因为平时写代码就没考虑过,那可不行,这道题起码得吹个十多分钟。

线程安全的定义

当多个线程同时访问一个对象时,调用这个对象的行为都可以获得正确的结果,那这个对象便是线程安全的。

反过来说导致多线程环境下线程不安全的条件是对共享数据的操作是非原子的

对于Java类来说就是存在对象属性的并且对属性的修改是非原子的那么就是非线程安全的

如何保证线程安全

解决线程安全问题自然是破坏线程不安全产生的条件。

  • 不使用共享数据
    例如在Java中,如果一个类没有属性的,或者属性都是只读的,那么就是线程安全的,因为不存在共享数据。当然也可以使用线程本地变量Threadlocal使得变量是线程本地的,这样多线程访问Threadlocal变量相当于访问自己本地的变量不存在冲突的。

  • 确保操作共享数据是原子的
    常见方法就是让线程排队执行不要同时去修改,即通过同步机制实现即加锁。比如通过悲观锁synchronized、lock等, 或者乐观锁CAS等。

在Java中,基于JVM的线程模型,多线程对于一个变量的操作会先操作自己的本地内存里面的值,而且本地变量不会立马刷新到主内存,所以可能会导致其他线程无法及时获取到变量的最新值的情况。

而且由于处理器会对执行的指令进行重排优化,导致执行的顺序和我们代码写的不一样,比如我们的代码先执行一些准备工作,完成后使用一个变量标志准备完成,之后由于指令重排导致先执行了变量标志准备完成赋值,导致其他线程以为工作准备完成了就开始执行业务代码,但是实际上没完成准备,所以就会出现问题。

一般在对共享数据做同步时都会使用volatile配合使用,因为volatile能保证可见性和有序性避免上述问题的发生。

controller、service、dao类线程安全分析

通过上述条件判断controller、service类是否是线程安全的,
首先controller、service、Dao类默认情况下是单例的,因为spring bean在默认情况下的作用域是singleton的也就是单例的,所以系统只会初始化一次,每次请求的都是同一个实例,那么久有可能存在线程安全问题了,因为存在多线程同时访问一个是对象实例的情况。

所以要讨论是否线程安全的还得分情况来分析

如果controller、service、Dao类是无状态的,也就是说没有修改属性操作的,那么就是线程安全的,平时写MVC项目的时候一般controller、service、Dao类是无状态所以没有线程安全问题。

如果controller、service、Dao类的对属性的修改都增加同步机制了或者属性都是使用本地变量threadlocal那么也没有线程安全问题。

如果把bean的作用域设置成prototype模式那么也不存在线程安全问题,因为每次请求都生成新的对象,就相当于不存在多线程同时访问了。

singleton:单例,默认作用域。
prototype:原型,每次创建一个新对象。
request:请求,每次Http请求创建一个新对象,适用于WebApplicationContext环境下。
session:会话,同一个会话共享一个实例,不同会话使用不同的实例。
global-session:全局会话,所有会话共享一个实例。

结论

默认配置下Spring mvc 的 Controller、Service、Dao等bean都是单例的。意思就是系统只会初始化一次,所以每次请求的都是同一个实例在处理。所以说是否线程安全的还需要看开发者是如何处理的,

如果这个Bean,是一个无状态Bean或者如果成员变量的修改都做了相应的同步机制或者使用本地变量threadlocal等那么就是线程安全的。否则就不是线程安全的。

相关内容

热门资讯

扩张提速、店铺“加密”,“硬折... 北京“硬折扣”超市“迎新”。6月26日,盒马旗下平价社区超市超盒算NB首批6家门店同步开业,网点覆盖...
外媒:黄金白银遭遇“完美风暴” 参考消息网6月26日报道据西班牙《经济学家报》网站6月23日报道,贵金属在金融市场正经历一场名副其实...
原创 法... 巴黎《费加罗报》给中国扣上"拯救者"的帽子,纽约《华尔街日报》隔着大西洋默默点头。 两家立场南辕北辙...
金价大跌!有商家囤货资产缩水百... 近期,国际金价持续大幅下行。6月26日19时30分左右,伦敦金现货价格报4050美元/盎司,较年内高...
原创 人... 大家好,这里是史记文谭,闲中着色,笑里有情,不废观星问月,亦赏市井浮生。 前言 咱们每天兜里揣着的钱...
交运股份告别六年扣非亏损,更名... 本报记者 张蓓 陈炳衡 北京报道 日前,上海交运集团股份有限公司(600676.SH)召开2026年...
原创 星... 马斯克的手又伸长了。这次不是火箭回收,也不是把"星链"塞进乌克兰战壕,而是直接杀进美国消费者的手机号...
视频丨一部剧带火一座城 “追剧... 第31届上海电视节各奖项昨晚(26日)揭晓,谍战题材电视剧《沉默的荣耀》在5项重磅提名中,最终斩获评...
东京经济论坛现场观察:日本华商... 作者 | 东京谢社长 6月26日,我去东京丽嘉皇家酒店参加了东京国际商学院EMBA二期开学典礼暨...
苏州投资人问:土耳其20年免税... 苏州投资人问:土耳其20年免税到底怎么理解? 最近一段时间,苏州工业园区和外企圈子里,关于土耳其20...
刘强东为70万京东物流人员规划... 职业被智能化设备迭代替代,已经成为当下众多从业者共同的内心顾虑。近期刘强东在行业论坛的发言,再度引发...
富国基金换帅:裴长江退休卸任,... 6月26日,富国基金发布高级管理人员变更的公告,董事长裴长江因退休离任,申万宏源证券执行委员会成员王...
两部门最新发布!事关黄金及黄金... 6月26日,中国人民银行、海关总署联合发布通知,就《黄金及黄金制品进出口管理办法(征求意见稿)》向社...
中信重工重构全球矿山装备供应链... 文丨承承 编辑丨李壮 2026年盛夏,第四届“中国国际供应链促进博览会”在北京顺义拉开帷幕。在中信集...
全球爆火的ETF,纳入中国存储... 史上增长最快的新发ETF,刚刚把"中国存储龙头"买成了前十大重仓! 6月,Roundhill Mem...
金价暴跌!重回“3字头”时代 继6月24日、25日伦敦金现连续两日盘中跌破4000美元/盎司后,6月26日国际金价延续跌势。 截至...
一批站在“光”里的基金经理们,... 【导读】一批绩优“追光者”密集出手限购,年内业绩前十均已“闭门谢客” 中国基金报记者 曹雯璟 仅过了...
赛场出圈,多品类业务破局,蒙牛... 2026世界杯加持,股价逆势走高! 文/每日财报 南黎 夏日的墨西哥城阿兹特克体育场,伴随着202...
IPO抢着给科技输血,钱却在选... 2026年上半年,A股IPO市场交出81家上市、1057亿元募资的成绩单,新股首日回报率233%创近...
原创 缅... 缅甸领导人敏昂莱结束访华行程刚回到内比都,缅甸官方就向全世界扔出了一枚重磅炸弹——正式宣布发现总规模...