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等那么就是线程安全的。否则就不是线程安全的。

相关内容

热门资讯

廊坊银行鏖战“逆风局” 在中小银行股权拍卖热潮之下,廊坊银行正遭遇市场的“审视”。2月9日,北京金融法院即将上拍廊坊银行一笔...
对话 | 陈行甲:公益需要专业... 记者 刘亚宁 近日,公益领域知名人物、曾以“网红县委书记”为人所知的陈行甲,因其个人收入问题受到争议...
金星啤酒港股IPO闯关,中式精... 2026年1月13日,河南金星啤酒股份有限公司(下称“金星啤酒”)正式向香港联交所主板递交上市申请,...
原创 又... 一管尚未进入临床试验的药膏, 如何点燃股民热情? 作者丨姚悦 编辑丨于婞 来源 | 野马财经 开年以...
原创 麦... 最近年底了,要看明年的经济新趋势,其实早已奠定了!继续要促进内需消费!这个方向没有停止,那么也就意味...
“三九”天戴帽=护心脑 三九寒天,寒气刺骨,不少人裹紧大衣却忽略头部保暖。专家提醒,寒从“头”入非虚言,一顶帽子竟是护心脑的...
12天获数千万融资,高瓴、智元... 小米(01810.HK)原中国区市场部总经理王腾再次冲上热搜。 这一次,他的身份是今日宜休科技公司(...
耐克大中华区换帅,“Win N... 自推行“Win Now”战略以来,耐克高层变动频繁。这次轮到了大中华区。 1月21日,耐克公司宣布,...
和讯投顾王宇:拥抱趋势才是主流... 1月21日,和讯投顾王宇分析称,自从上周市场主动降温以来,就一直在对于商业航天和AI应用的修复预期要...
消息称马斯克希望在7月前完成S... 马斯克 北京时间1月21日,据《华尔街日报》报道,埃隆马斯克(Elon Musk)这些年来一直抵制让...
原创 今... 昨天,国际金价站上了4600美元一盎司,国内金店首饰价格直接飙到1300元一克。 很多人一看这价格就...
这种“静态”运动,降压效果竟排... 高血压作为一种常见的慢性疾病,已经成为威胁全球人类健康的重要杀手之一。据世界卫生组织统计,全球约有 ...
跨境ETF加速扩容,港股赛道成... 来源:21世纪经济报道 21世纪经济报道特约记者 庞华玮 今年1月12日,中国跨境ETF市场迎来历史...
贴牌工厂的IPO幻梦:宁波惠康... 当一家深耕ODM贴牌业务26年的企业,试图以“全球民用制冰机市占率第一”的龙头叙事冲击主板IPO,其...
突发!锂电材料龙头拟赴港上市! 本报记者 陈红 1月21日晚间,苏州天华新能源科技股份有限公司(以下简称“天华新能”,股票代码:30...
茅台联名冰淇淋卖不动了? 当茅台冰淇淋在便利店冰柜里积灰时,泸州老窖与《三体》联名的"黑暗森林"酒却创下10分钟售罄的纪录。这...
原创 中... 1月16日,俄罗斯《生意人报》刊发了一则震动全球的新闻:中俄之间历时14年的电力进口合作宣告终止。与...
去年前三季净利下滑近两成,奕帆... 深圳商报·读创客户端记者 张弛 1月21日,奕帆传动(301023.SZ)开盘即封住20%涨停,截至...
AI应用ETF的“故事”讲完了... 2026年开年,AI应用板块无疑是市场最瞩目的焦点之一,AI投资风向从算力基础设施向具体应用场景扩散...
银行应该承担房价下跌的损失吗? 最近看到一个观点,说是银行应该承担房价下跌的损失,因为大洋对岸的漂亮国就是这么做的, 在M国你可以主...