首页 > 其他分享 >spring依赖注入单例模式下(默认都是单例),类变量(实例变量)线程安全问题

spring依赖注入单例模式下(默认都是单例),类变量(实例变量)线程安全问题

时间:2023-09-15 19:22:30浏览次数:36  
标签:变量 静态 spring 对象 实例 线程 单例

java变量是程序中最基本的存储单元,其要素包括变量名,变量类型和作用域。
Java的变量类型有:

    成员变量类中的变量(独立于方法之外的变量)
    局部变量类的方法中的变量。

而 java类的成员变量又有俩种:

    静态变量(类变量): 独立于方法之外的变量,用 static 修饰。
    实例变量: 独立于方法之外的变量,不过没有 static 修饰。
成员变量和类变量(静态变量)的区别:

1、两个变量的生命周期不同

  成员变量随着对象的创建而存在,随着对象的回收而释放。
  静态变量随着类的加载而存在,随着类的消失而消失。

2、调用方式不同

  成员变量只能被对象调用。
  静态变量可以被对象调用,还可以被类名调用。

3、别名不同

  成员变量也称为实例变量。
  静态变量也称为类变量。


4、数据存储位置不同

成员变量存储在堆内存的对象中,所以也叫对象的特有数据。
静态变量数据存储在方法区(共享数据区)的静态区,所以也叫对象的共享数据。

  
成员变量所属于对象。所以也称为实例变量。
静态变量所属于类。所以也称为类变量。

成员变量存在于堆内存中。
静态变量存在于方法区中。

成员变量随着对象创建而存在。随着对象被回收而消失。
静态变量随着类的加载而存在。随着类的消失而消失。

成员变量只能被对象所调用 。
静态变量可以被对象调用,也可以被类名调用。


 

静态变量:线程不安全。

静态变量即类变量,前面加static,位于方法区,为所有对象共享,共享一份内存,一旦静态变量被修改,其他对象均对修改可见,故线程不安全。

实例变量:单例模式(只有一个对象实例存在)线程不安全,非单例线程安全。

实例变量为不加static的变量,在虚拟机的堆中分配,若在系统中只存在一个此对象的实例,在多线程环境下,“犹如”静态变量那样,被某个线程修改后,其他线程对修改均可见,故线程非安全;如果每个线程执行都是在不同的对象中,那对象与对象之间的实例变量的修改将互不影响,故线程安全

局部变量:线程安全。

每个线程执行时将会把局部变量放在各自栈帧的工作内存中,线程间不共享,故不存在线程安全问题。

 

 

由于spring中默认注入的都是单例模式。所以实例变量也是共享的,并不会每次销毁

标签:变量,静态,spring,对象,实例,线程,单例
From: https://www.cnblogs.com/xiaoxiaoxingkong/p/17705773.html

相关文章

  • 在springboot中处理UDP流
    配置: <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-integration</artifactId></dependency><dependency><groupId>org.springframework.integration</gr......
  • springboot+vue导出本地可执行文件
    1、前端页面增加下载链接<ahref="http://localhost:80/system/download"download="xxx.exe">下载地址</a>2、后端读取文件下载//下载文件@GetMapping("/system/download")publicvoiddownload(HttpServletResponseresponse){S......
  • mac版本Spring5.0源码环境搭建
    下载spring5.0版本代码链接是:https://github.com/spring-projects/spring-framework.git装gradle,使用的版本是8.3版本链接是:https://gradle.org/next-steps/?version=8.3&format=bin有错误提示:/Users/wangyu/work/code/spring-framework/buildSrc/src/main/java/org/springfra......
  • Docker+harbor+rancher2.6.3部署springboot项目
    1、在pom的文件中添加以下配置<build><finalName>${project.artifactId}</finalName><plugins><plugin><groupId>com.spotify</groupId><artifactId>docker-maven-plugin</artifactId......
  • 深入理解Spring MVC框架及其工作原理
    SpringMVC是一种基于Java的Web应用程序开发框架,它提供了一种模型-视图-控制器(MVC)的架构模式,用于构建灵活、可扩展且高效的Web应用程序。本文将深入探讨SpringMVC框架的各个组件和工作原理。介绍SpringMVCSpringMVC是SpringFramework的一个模块,用于开发Web应用程序。它基于经......
  • C++之单例模式(6千字长文详解)
    单例模式什么是单例模式单例模式是设计模式的一种设计模式:设计模式(DesignPattern)是一套被反复使用、多数人知晓的、经过分类的、代码设计经验的总结。为什么会产生设计模式这样的东西呢?就像人类历史发展会产生兵法。最开始部落之间打仗时都是人拼人的对砍。后来春秋战国时......
  • 解决SpringBoot Async异步方法获取不到Security Context
     SecurityContextHolder.setStrategyName(SecurityContextHolder.MODE_INHERITABLETHREADLOCAL);这样设置的话很不安全,不废话,直接上代码,改造一下AsyncConfig就可以了,线程也安全/***@description:线程池的配置*/@ConfigurationpublicclassAsyncConfig{privates......
  • 02什么是变量
    1什么是变量变量:一种会变化的状态,这个状态可以描述世间万物2Python中定义变量name='Yting'#变量名赋值符号变量值print(name)Ytingprint('Yting')Ytingx=10y=19height=1803定义变量名的命名规范变量名得具有某种意义变量名只能使用字母、......
  • Spring Boot + minio 实现高性能存储服务,So Easy~!
    什么是minio引用官网:MinIO是根据GNUAffero通用公共许可证v3.0发布的高性能对象存储。它与AmazonS3云存储服务兼容。使用MinIO构建用于机器学习,分析和应用程序数据工作负载的高性能基础架构。官网地址:https://min.io/文档地址:https://docs.min.io/一.使用docker搭......
  • 【规范】SpringBoot接口返回结果及异常统一处理,这样封装才优雅
    前言......