java变量是程序中最基本的存储单元,其要素包括变量名,变量类型和作用域。
Java的变量类型有:
成员变量类中的变量(独立于方法之外的变量)
局部变量类的方法中的变量。
而 java类的成员变量又有俩种:
静态变量(类变量): 独立于方法之外的变量,用 static 修饰。
实例变量: 独立于方法之外的变量,不过没有 static 修饰。
成员变量和类变量(静态变量)的区别:
1、两个变量的生命周期不同
成员变量随着对象的创建而存在,随着对象的回收而释放。
静态变量随着类的加载而存在,随着类的消失而消失。
2、调用方式不同
成员变量只能被对象调用。
静态变量可以被对象调用,还可以被类名调用。
3、别名不同
成员变量也称为实例变量。
静态变量也称为类变量。
4、数据存储位置不同
成员变量存储在堆内存的对象中,所以也叫对象的特有数据。
静态变量数据存储在方法区(共享数据区)的静态区,所以也叫对象的共享数据。
成员变量所属于对象。所以也称为实例变量。
静态变量所属于类。所以也称为类变量。
成员变量存在于堆内存中。
静态变量存在于方法区中。
成员变量随着对象创建而存在。随着对象被回收而消失。
静态变量随着类的加载而存在。随着类的消失而消失。
成员变量只能被对象所调用 。
静态变量可以被对象调用,也可以被类名调用。
静态变量:线程不安全。
静态变量即类变量,前面加static,位于方法区,为所有对象共享,共享一份内存,一旦静态变量被修改,其他对象均对修改可见,故线程不安全。
实例变量:单例模式(只有一个对象实例存在)线程不安全,非单例线程安全。
实例变量为不加static的变量,在虚拟机的堆中分配,若在系统中只存在一个此对象的实例,在多线程环境下,“犹如”静态变量那样,被某个线程修改后,其他线程对修改均可见,故线程非安全;如果每个线程执行都是在不同的对象中,那对象与对象之间的实例变量的修改将互不影响,故线程安全。
局部变量:线程安全。
每个线程执行时将会把局部变量放在各自栈帧的工作内存中,线程间不共享,故不存在线程安全问题。
由于spring中默认注入的都是单例模式。所以实例变量也是共享的,并不会每次销毁
标签:变量,静态,spring,对象,实例,线程,单例 From: https://www.cnblogs.com/xiaoxiaoxingkong/p/17705773.html