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

发布时间 2023-09-15 19:20:26作者: 小小的流星

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

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

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

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

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

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

2、调用方式不同

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

3、别名不同

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


4、数据存储位置不同

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

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

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

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

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


 

静态变量:线程不安全。

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

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

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

局部变量:线程安全。

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

 

 

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