记类成员变量 vs 方法中的变量

目录

一、什么是类成员变量、什么是方法中的变量

二、两者对比

1.生命周期和作用域

2.内存分配

3.线程安全性问题

4.线程安全性考虑设计原则

5.类成员变量的线程安全性问题实例说明

6.每次方法调用都会创建新的局部变量副本怎么理解


一、什么是类成员变量、什么是方法中的变量

类成员变量(实例变量):定义在类中的变量,类中的各方法可以共享的变量。

方法变量:定义在方法中的变量(局部变量),只能在本方法中访问到。

如下示例:

java 复制代码
public class Ttesttt {
    private String abc123; //类成员变量

    public String longTime1() {
        abc123 = "123";
        return abc123;
    }

    public String longTime2(String aabb, String add) {
        abc123 = "123456";
        String aaccc = "55"; //方法中的变量
        return aaccc;
    }

}

二、两者对比

1.生命周期和作用域

类成员变量:

属于类的实例,随着对象的创建而分配内存,对象销毁时释放。整个对象的生命周期中都可以访问。

类中的多个方法可以共享类成员变量,都可以访问和修改它。

方法中变量(局部变量):

在方法被调用时创建,在方法执行完毕后销毁。

只在声明它的方法内部访问。

每次方法调用都会创建新的局部变量副本。(怎么理解呢后面讲解)

2.内存分配

类成员变量:

对象创建时存储在堆内存中,有初始化默认值,不用必须显示初始化。

方法中变量:

存储在栈内存中,必须显式初始化后才能使用。

3.线程安全性问题

类成员变量:

如果多个线程同时访问同一个对象的实例变量,可能会出现线程安全问题

需要同步机制保护(如synchronized、volatile等)

是线程间共享的数据

方法中变量:

每个线程都有自己的方法调用栈,局部变量是线程安全的

不同线程调用同一方法时,各自拥有独立的局部变量副本

通常不需要额外的同步措施

4.线程安全性考虑设计原则

在Spring框架中,Controller通常是单例的,那么它的实例变量就会被多个请求共享。因为一个请求通常就是一个线程。

类成员变量:

通常存储一些全局性通用的,共享的数据。

不轻易改变的,存在于整个应用的生命周期内的数据。

不存储请求相关的,有状态改变的数据。或者定义的实例变量是无状态的。

一定要注意线程安全问题。

方法中的变量:

有天然的线程安全性,适合存储临时计算结果或方法内部使用的数据,有状态变化的数据。

5.类成员变量的线程安全性问题实例说明

如上图示例代码,如果访问/test1请求的时候传入的值是"王二",那么类成员变量tempStr的值就是"王二"。当随后访问/test2请求时我们想要得到的返回值也希望是"王二",但如果在这之前有人又访问了/test1请求,会发生什么?

答案是:类成员变量tempStr的值会被新请求传入/test1 的值覆盖掉,比如"张三"。这个时候原本访问/test2请求想要得到"王二"的却变成了"张三"。这就出现了线程安全问题。后果可能很严重。

所以呢?类成员变量不要这样使用,可以在项目初始化类中使用存储固定端口、固定IP的类成员变量,这类数据不易改变。

亦或者Spring项目中注入调用类

这个实例类是可以共享的,没有保存任何与具体实例相关的状态信息,是无状态的。

6.每次方法调用都会创建新的局部变量副本怎么理解

当多个线程调用同一个方法时,每个线程都会在自己的调用栈中创建该方法的局部变量副本。这意味着不同线程之间不会共享这些局部变量,从而保证了线程安全性。

文中提到过每次发起请求(如 get请求/test1方法)调用一个方法时,就是一个线程运行。既然是不同的线程,就有各自独立的栈内存,各自栈内存中存储各自的局部变量值。所以每次方法调用都会创建新的局部变量副本,每个线程间不存在共享和干扰。也可以看成一个线程就是一条生产线。

相关推荐
方也_arkling7 小时前
【Java-Day08】static / final / 枚举
java·开发语言
橙淮7 小时前
Spring Bean作用域与生命周期全解析
java·spring
风吹夏回7 小时前
Python 全局异常处理:从“满屏 try-except”到优雅兜底
开发语言·python
Chengbei117 小时前
一站式源码安全检测工具、云安全 / APP / 小程序源码敏感信息递归多层目录扫描AK、JWT、手机号、身份证等敏感信息
java·开发语言·安全·web安全·网络安全·系统安全·安全架构
llz_1127 小时前
web-第一次课后作业
java·开发语言·idea
小熊Coding8 小时前
Python爬取当当网二手图书项目实战!
开发语言·爬虫·python·beautifulsoup·requests·二手图书
秋98 小时前
Java项目运行5天左右自动宕机:系统性定位与解决方案
java·开发语言·python
小江的记录本8 小时前
【JVM虚拟机】垃圾回收GC:垃圾收集器:CMS:核心原理、回收流程、优缺点、废弃原因(附《思维导图》+《面试高频考点清单》)
java·jvm·后端·python·spring·面试·maven
xiaoshuaishuai88 小时前
C# 内存管理与资源泄漏
开发语言·c#
DIY源码阁8 小时前
JavaSwing学生成绩管理系统 - MySQL版
java·数据库·mysql·eclipse