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

相关内容

热门资讯

强外贸拓市场 宜宾19家企业亮... 4月15日至5月5日,第139届中国进出口商品交易会(简称“广交会”)在广州举办。活动期间,宜宾市商...
原创 运... 运-20运输机近日再一次展现了其非凡能力——为救治一名身处西藏阿里高原的重病边防战士,它完成了一次跨...
水井坊总经理再变动!胡庭洲在任... 在刚刚披露完2025年报和2026年一季报后,水井坊再次迎来核心高管的变动。 5月6日,水井坊发布公...
康宁公司(GLW)维持超过14... 康宁公司(GLW)维持超过14%的涨幅,持稳于185美元附近,美股盘初曾达到195.81美元——盘中...
原创 国... 阅读须知:本文内容所有信息和数据,均为作者查阅官方信息和网络已知数据整合解析,旨在让读者更清晰了解相...
原创 金... 2026年5月6日,国内金价继续从高位回落,上海黄金交易所的AU9999报每克1013元,沪金期货主...
新华鲜报丨交易笔数大增 从支付...   新华社北京5月6日电(记者吴雨)消费市场活力十足,尽显中国经济强劲韧性。中国人民银行5月6日发布...
原创 安... - 对外直接投资[1]:2026年一季度中国全行业对外直接投资445亿美元,同比增长8.9%;非金融...
龙芯中科:现在公司主打性价比,... 证券日报网5月6日讯 ,龙芯中科在接受调研者提问时表示,公司过去主打芯片自主性,所以是应用导向的,比...
新华鲜报|交易笔数大增 从支付... 消费市场活力十足,尽显中国经济强劲韧性。中国人民银行5月6日发布的数据显示,今年“五一”假期支付交易...
马斯克同意支付150万美元罚款 据路透社报道,4日提交的一份法庭文件显示,美国证券交易委员会已经与美国企业家马斯克就收购推特期间涉嫌...
福建沙县农商银行被罚170万元 【大河财立方消息】5月6日,国家金融监督管理总局三明监管分局披露的行政处罚信息显示,因违规下达存款考...
原创 只... 此前盛传三星要暴砍中国市场产品线的消息,终于落地了。 5月6日,三星在官网正式发布公告,停止在中国大...
珀莱雅上市9年首次“双降”,二... 出品 |达摩财经 此次是珀莱雅第二次向港交所递表。去年8月,珀莱雅发布公告称,为加快国际化战略和海...
沿河县中界镇创新“三营联动”发... 沿河县中界镇创新“三营联动” 发展壮大农村集体经济 近年来,沿河县中界镇聚焦“强村富民”目标,创新推...
老牌私募打新违规被“点名”! 来源:金融时报 一家老牌私募机构因网下打新违规被“点名”。 近日,中国证券业协会(以下简称“中证协”...
和讯信息张杨:五月开门红!存储... 5月开门红,存储芯片大涨还能不能在科技里躺平了?和讯信息张杨分析,首先是假期外围大涨,导致今天芯片大...
警报响起!30年期美债收益率再... 全球股市处于历史高位,但债券市场的警示信号越来越清晰。 30年期美国国债收益率重新站上5%的关口,再...
五粮液急了!先推80亿元至10... 年报推迟公布之后,五粮液摊上事了。股民纷纷质疑五粮液“修改数据”,二级市场,公司股价今日逆市下跌近5...
收假必看!央行+海关新政落地,... 来源:市场资讯 (来源:矿业俱乐部) 央行、海关总署联合发布公告,自2026年6月1日起升级黄金及...