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

相关内容

热门资讯

蜻蜓订购APP贵金属订购非法期...   蜻蜓订购APP以"投资平台"名义对外宣传,主打贵金属期货(订购)交易。该平台一方面强调自身"正规...
悟空订购APP非法期货交易欺骗...   近期,有投资者反映,“悟空订购APP”等平台以白银、贵金属订购为名,宣传所谓“高收益”“低门槛”...
小赢淘金APP期货投资骗局,平...   “小赢淘金”之流,最擅长的就是用“注册送现金”、“充值返券”的糖衣炮弹来引流。别天真地以为那是福...
八方淘金APP非法期货交易欺骗...   警惕!八方生财、每日淘金、小赢淘金、悟空订购、蜻蜓订购、斗金订购等APP均涉嫌非法期货交易!  ...
智易购APP贵金属订购交易骗局...   很多人看到“3元起投”“充值送福利”“操作简单”“随时提现”这类宣传,很容易把智易购APP当成普...
喜玛银庄APP商品订购投资骗局...   喜玛银庄APP白银、铂金“现货订购”骗局警示:无资质平台涉嫌非法期货交易,投资者爆仓后如何维权?...
吉鑫乐享APP炒贵金属订购交易...   近期,多名投资者反映在“吉鑫乐享APP”进行贵金属投资时遭遇严重亏损,甚至血本无归。看似正规的“...
易掘金APP虚假期货投资骗局,...   “易掘金”的APP它打着“高收益、灵活投资”的旗号,宣称通过“商品订购”就能轻松赚钱,吸引了不少...
在大吉订购APP订购交易亏损被...   近期,不少投资者反映在“大吉订购App”上投资白银、铂金等商品遭遇严重亏损。该平台宣称提供现货订...
铂银壹号APP商品订购交易亏损...   许多中小投资者误以为网上的“商品现货订购”是合规合法的理财渠道,殊不知这背后隐藏着巨大的合规风险...
兴鑫淘金APP贵金属订购交易亏...   白银、贵金属或其他商品类投资,除国家批准的正规期货交易场所及持牌期货公司外,市面上大量第三方交易...
铂银掘金APP无资质的违规平台...   铂银掘金等平台的投资者,往往是被“注册送现金”“充值返现券”“首单免亏”等广告话术吸引,进而下载...
八方淘金APP订购交易不合规,...   “八方淘金APP”“铂银掘金APP”“铂银壹号APP”等软件被指以“现货订购”为名,实际采用高杠...
在指尖订购APP订购商品亏损被...   指尖订购APP这类平台,表面是“订购交易”,实则是披着电商外衣的非法期货陷阱。绝大多数投资者被蒙...
在犀贝易购APP做商品订购交易...   市面上打着“现货投资”“贵金属交易”旗号的APP并不少,但真正合规、受监管的平台并不多。犀贝易购...
易达淘金APP虚假商品订购交易...   易达淘金APP存在严重的虚假宣传与违规交易行为。该平台打着“商品订购”的旗号,实则通过不合规的交...
大浪淘金APP白银订购亏损被骗...   大浪淘金APP最隐蔽的套路,在于其完全封闭的内盘交易系统。表面上,它宣称与国际贵金属市场接轨;实...
一品好购APP上订购白银出现亏...   一品好购APP原名“一品订购”,运营方为上海宝智未来信息技术有限公司。近期不少投资者反映在该平台...
九州订购APP贵金属订购投资骗...   九州订购APP正通过抖.音、快手、今日头条等平台大量投放投资广告,用“5元起投”“充值返现”“0...
坚锅淘金APP交易软件并不正规...   当前,市面上大量所谓的“现货商城订购”交易软件,早已偏离了正常的实物商品买卖,演变为高杠杆、高手...