当前位置:首页 > 技术 >

spring怎么保证线程安全(在spring中怎么解决线程安全问题)

来源:原点资讯(m.360kss.com)时间:2023-11-03 12:00:27作者:YD166手机阅读>>

spring怎么保证线程安全,在spring中怎么解决线程安全问题(1)

Spring作为一个IOC/DI容器,帮助我们管理了许许多多的“bean”。但其实,Spring并没有保证这些对象的线程安全,需要由开发者自己编写解决线程安全问题的代码。

Spring对每个bean提供了一个scope属性来表示该bean的作用域。它是bean的生命周期。例如,一个scope为singleton的bean,在第一次被注入时,会创建为一个单例对象,该对象会一直被复用到应用结束。

  • singleton:默认的scope,每个scope为singleton的bean都会被定义为一个单例对象,该对象的生命周期是与Spring IOC容器一致的(但在第一次被注入时才会创建)。
  • prototype:bean被定义为在每次注入时都会创建一个新的对象。
  • request:bean被定义为在每个HTTP请求中创建一个单例对象,也就是说在单个请求中都会复用这一个单例对象。
  • session:bean被定义为在一个session的生命周期内创建一个单例对象。
  • application:bean被定义为在ServletContext的生命周期中复用一个单例对象。
  • websocket:bean被定义为在websocket的生命周期中复用一个单例对象。

我们交由Spring管理的大多数对象其实都是一些无状态的对象,这种不会因为多线程而导致状态被破坏的对象很适合Spring的默认scope,每个单例的无状态对象都是线程安全的(也可以说只要是无状态的对象,不管单例多例都是线程安全的,不过单例毕竟节省了不断创建对象与GC的开销)。

无状态的对象即是自身没有状态的对象,自然也就不会因为多个线程的交替调度而破坏自身状态导致线程安全问题。无状态对象包括我们经常使用的DO、DTO、VO这些只作为数据的实体模型的贫血对象,还有Service、DAO和Controller,这些对象并没有自己的状态,它们只是用来执行某些操作的。例如,每个DAO提供的函数都只是对数据库的CRUD,而且每个数据库Connection都作为函数的局部变量(局部变量是在用户栈中的,而且用户栈本身就是线程私有的内存区域,所以不存在线程安全问题),用完即关(或交还给连接池)。

有人可能会认为,我使用request作用域不就可以避免每个请求之间的安全问题了吗?这是完全错误的,因为Controller默认是单例的,一个HTTP请求是会被多个线程执行的,这就又回到了线程的安全问题。当然,你也可以把Controller的scope改成prototype,实际上Struts2就是这么做的,但有一点要注意,Spring MVC对请求的拦截粒度是基于每个方法的,而Struts2是基于每个类的,所以把Controller设为多例将会频繁的创建与回收对象,严重影响到了性能。

关注

感谢阅读,如果这篇文章帮助了您,欢迎 点赞收藏,关注转发 哟。您的帮助是我们前行的动力,我们会提供更多有价值的内容给大家... 谢谢!

栏目热文

spring如何解决线程安全问题(spring多例模式是线程安全的吗)

spring如何解决线程安全问题(spring多例模式是线程安全的吗)

Spring作为一个IOC/DI容器,帮助我们管理了许许多多的"bean"。但其实,Spring并没有确保这些对象的线程...

2023-11-03 11:32:17查看全文 >>

spring中如何解决多例线程安全(spring创建对象线程安全怎么解决)

spring中如何解决多例线程安全(spring创建对象线程安全怎么解决)

Spring与线程安全ThreadLocalThreadLocal中的内存泄漏参考文献Spring与线程安全Spring...

2023-11-03 11:23:09查看全文 >>

spring解决线程安全问题(spring是怎么保证线程安全的)

spring解决线程安全问题(spring是怎么保证线程安全的)

Spring与线程安全Spring作为一个IOC/DI容器,帮助我们管理了许许多多的“bean”。但其实,Spring并...

2023-11-03 11:53:27查看全文 >>

丰田左前门音响没声音(丰田全车喇叭没有声音)

丰田左前门音响没声音(丰田全车喇叭没有声音)

在中国大陆被称为子弹头的丰田普瑞维亚,是一款兼顾了动力性和舒适性的豪华商务车,车主用这台车专做商务接待用,可美中不足的...

2023-11-03 11:39:06查看全文 >>

丰田音响锁死(丰田音响解锁视频)

丰田音响锁死(丰田音响解锁视频)

丰田子弹头( Previa )音响锁止的解码操作程序1、首先将点火开关开启后,暂时不打开音响开关,两手指同时按住音响装饰...

2023-11-03 11:28:02查看全文 >>

spring 单例解决线程安全问题(spring解决线程安全问题)

spring 单例解决线程安全问题(spring解决线程安全问题)

一、Spring单例模式与线程安全Spring框架里的bean,或者说组件,获取实例的时候都是默认的单例模式,这是在多线...

2023-11-03 11:20:27查看全文 >>

spring怎么解决线程安全问题(spring是怎么保证线程安全的)

spring怎么解决线程安全问题(spring是怎么保证线程安全的)

点击上方 "程序员小乐"关注, 星标或置顶一起成长每天凌晨00点00分, 第一时间与你相约每日英文Goo...

2023-11-03 11:19:42查看全文 >>

如何解决spring线程安全问题(spring线程安全解决方法)

如何解决spring线程安全问题(spring线程安全解决方法)

专注于Java领域优质技术,欢迎关注作者:Java3y Java3y前言文本已收录至我的GitHub仓库,欢迎Star:...

2023-11-03 12:03:19查看全文 >>

spring如何处理线程安全(spring如何处理多线程问题)

spring如何处理线程安全(spring如何处理多线程问题)

Spring与线程安全Spring作为一个IOC/DI容器,帮助我们管理了许许多多的“bean”。但其实,Spring并...

2023-11-03 11:53:53查看全文 >>

spring创建单例怎么保证线程安全(spring怎么解决线程安全问题)

spring创建单例怎么保证线程安全(spring怎么解决线程安全问题)

问题背景这段时间在做项目的时候,考虑到Spring中的bean默认是单例模式的,那么当多个线程调用同一个bean的时候就...

2023-11-03 11:21:48查看全文 >>

文档排行