首页 > 其他分享 >Spring中的单例bean

Spring中的单例bean

时间:2024-05-11 10:33:35浏览次数:23  
标签:Spring bean volatile 单例 有序性 线程

Spring框架中的单例bean是线程安全的吗?

不是线程安全的,当多用户同时请求一个服务时,容器会给每一个请求分配一个线程,这是多个线程会并发执行该请求对应的业务逻辑(成员方法),如果该处理逻辑中有对该单列状态的修改(体现为该单例的成员属性),则必须考虑线程同步问题。
Spring框架并没有对单例bean进行任何多线程的封装处理。关于单例bean的线程安全和并发问题需要开发者自行去搞定。
比如:我们通常在项目中使用的Spring bean都是不可变的状态(比如Service类和DAO类),所以在某种程度上说Spring的单例bean是线程安全的。
如果bean有多种状态的话(比如View Model对象),就需要自行保证线程安全。最浅显的解决办法就是将多态bean的作用由singleton变更为prototype或者进行加锁

线程安全的三大特性

参考

  1. 原子性
    原子性是指操作是不可分的。其表现在于对于共享变量的某些操作,应该是不可分的,必须连续完成。可以使用synchronized或者是lock进行加锁处理。
  2. 可见性
    可见性是指一个线程对共享变量的修改,另外一个线程能够立刻看到。
    Java方面提供了两个关键字来保证多线程情况下共享变量的可见性方案(volatilesynchronized)。
  3. 有序性
    有序性是指程序在执行的时候,程序的代码执行顺序和语句的顺序是一致的。
    在执行程序时,为了提高性能,编译器和处理器常常会对指令做重排序,重排序不会影响单线程的执行结果,但是在并发情况下,可能会出现诡异的BUG。
    Java中可以使用volatile来保证顺序性,synchronizedlock也可以来保证有序性,和保证原子性的方式一样,通过同一段时间只能一个线程访问来实现的。
    JVM 还通过happen-before原则来隐式的保证顺序性。其中有一条就是适用于volatile关键字的,针对于volatile关键字的写操作肯定是在读操作之前,也就是说读取的值肯定是最新的。
    操作系统通过总线lock锁MESI(缓存一致性协议)来实现内存可见性。

标签:Spring,bean,volatile,单例,有序性,线程
From: https://www.cnblogs.com/worshipone/p/18185939

相关文章

  • Java面试题:Spring Bean线程安全?别担心,只要你不写并发代码就好了!
    Spring中的Bean是否线程安全取决于Bean的作用域(scope)。Spring提供了几种不同的Scope,其中包括Singleton、Prototype、Request、Session、GlobalSession等。 SingletonScope(单例模式)默认情况下,SpringBean是SingletonScope,这意味着在整个应用程序上下文中只有一个实例。......
  • Springboot Data Jdbc中Contains和Containing的用法
    Contains和Containing的用法privateStringtitle;privateList<String>tags;//查询标题包含指定字符串的书籍List<Book>findByTitleContains(Stringtitle);//查询包含指定标签的书籍List<Book>findByTagsContaining(Stringtag);--查询标题包含"Spring"的书......
  • SpringBoot整合Mybatis时mapper文件和xml文件的位置
    xml文件放在resources下看下我的项目目录2.由于放在resurces下就无法扫描到xml文件,所以就需要在配置文件配置--mapper文件位置mybatis.mapper-locations=classpath:mapper/*.xml或mybatis.mapper-locations=classpath:/mapper/*.xmlxml和mapper文件放在一起我的项目......
  • Springboot单机多副本运行,解决端口冲突
    一、代码方式(修改配置类)@BeanpublicWebServerFactoryCustomizer<ConfigurableWebServerFactory>MyCustomizer(){returnnewWebServerFactoryCustomizer<ConfigurableWebServerFactory>(){@Overridepublicvoidcustomize(ConfigurableWebSer......
  • springboot+vue快速部署前后台项目,无需服务器
    问题前言我们都知道,现在的主流开发大多数为,前后端分离,目前流行的框架,大多数是springboot+elementui这些框架,这无疑是给开发部署项目带来了便利,我们后台开发无需关心前端如何部署的,前端同样也无需关系后台如何部署,只需要确认能够访问即可。存在有如下问题:当由于条件有限,我......
  • SpringBoot集成微信APP支付
    目录废话不多说,先上代码上业务代码建议自己也看看官方文档,光C解决不了小问题。懂的吧代码随着微信支付的迭代可能会有啥问题,及时评论!废话不多说,先上代码application-dev.yml#支付pay:#支付回调通知地址notifyUrl:别想C填自己的#微信App支付weChat:别想C......
  • Spring Cloud 部署时如何使用 Kubernetes 作为注册中心和配置中心
    一、SpringCloud支持的常见注册中心和配置中心。SpringCloud自带的注册中心Eureka以及config配置中心Nacos,支持注册中心和配置中心等,可以参考:https://www.cnblogs.com/laoqing/p/17797759.htmlZookeeperConsulEtcdKubernetes,当SpringCloud服务都是通过Kubernetes部......
  • windows服务器部署springboot项目
    @目录方法一使用cmd命令运行方法二将项目配置成服务运行部署第一步:编写xml文件执行命令生成一个服务删除这个服务如有问题可在评论区发表。方法一使用cmd命令运行java-jartestboot.jar输入java-jar直接将jar包拖进去,然后按enter(回车)就好了。如果失败,那就是jar......
  • SpringBoot读取Resources下的文件
    packagecom.qzsl.dp.utils;importorg.springframework.beans.factory.annotation.Qualifier;importorg.springframework.core.io.Resource;importorg.springframework.core.io.ResourceLoader;importorg.springframework.stereotype.Component;importorg.springfr......
  • Spring Boot2中Swagger3使用
    1.依赖引入<!--引入swagger--><dependency><groupId>org.springdoc</groupId><artifactId>springdoc-openapi-ui</artifactId><version>1.7.0</version></dependency>2.常用注解介绍swagger2......