Java 变量的线程安全考虑 变量线程安全多线程Java变量静态变量实例变量
程序员文章站
2024-02-20 16:56:58
...
对于这一问题的思考来源于在Oracle EBS 的一次面试,面试题中有如下一道题: 13. Which of the following data elements are considered thread-safe? A. Local variables B. Static varriables C. Class variables D. Instance variables 上面的问题之前没有考虑过,所以就得查询资料,补充相关知识。
是否存在线程安全问题,首要考虑的是是否存在数据共享的问题(即多个线程同时操作某一资源的场景),再接着考虑怎样解决线程安全与否。
(1)静态变量:线程非安全。 静态变量即类变量,位于方法区,为所有对象共享,共享一份内存,一旦静态变量被修改,其他对象均对修改可见,故线程非安全。 (2)实例变量(得分情况) 实例变量即属性是用变量来表示的,这种变量就称为实例变量。实例变量是否存在线程安全隐患得分情况考虑: a. 实例变量为对象实例私有,在虚拟机的堆中分配,若在系统中只存在一个此对象的实例,在多线程环境下,“犹如”静态变量那样,被某个线程修改后,其他线程对修改均可见,故线程非安全; b. 如果每个线程执行都是在不同的对象中,那对象与对象之间的实例变量的修改将互不影响,故线程安全。 (3)局部变量(本地变量):线程安全。 a. 局部变量(本地变量)是在方法的内部或方法的一个代码块中声明的变量就是局部变量.作用域是一个方法或代码块, b. 每个线程执行时将会把局部变量放在各自栈帧的工作内存中,线程间不共享,故不存在线程安全问题。
实例变量和类变量的生命周期 类的成员变量有两种: 一种是被 static 关键字修饰的变量,叫类变量或静态变量; 另一种是没有 static 关键字修饰的变量,叫实例变量。 区别: 1、类的静态变量在内存中只有一个,Java 虚拟机在记载类的的过程中为静态变量分配内存,静态变量位于方法区,被类的所有实例共享。静态变量可以直接通过类名被访问。静态变量的生命周期取决于类的生命周期,当加载类的时候,静态变量被创建并分配内存空间,当卸载类的时候,静态变量被销毁并撤销所占内存。 2、类的每个实例都有相应的实例变量。没创建一个类的实例,Java 虚拟机就会为实例变量分配一次内存,实例变量位于堆区中。实例变量的生命周期取决于实例的生命周期,当创建实例的时候,实例变量被创建并分配内存,当销毁实例的时候,实例变量被销毁并撤销所占内存。 假如成员变量(包括静态变量和实例变量)是引用变量,那么当该成员变量结束生命周期时,并不意味着它所引用的对象也一定结束声明周期。 变量的生命周期和对象的生命周期是不同的概念。 静态变量可以作为所有的实例的共享数据,它不依赖于特定的实例;而实例变量属于特定的实例。
推荐阅读
-
Java 变量的线程安全考虑 变量线程安全多线程Java变量静态变量实例变量
-
java多线程编程之使用Synchronized块同步变量
-
java通过共享变量结束run停止线程的方法示例
-
Java--多线程:一个变量初始值100,一个任务对它进行50次自增操作,而另外一个任务对它进行50次自减操作。
-
多线程-用JAVA写一个多线程程序,写四个线程,其中二个对一个变量加1,另外二个对一个变量减1...
-
利用反射获取Java类中的静态变量名及变量值的简单实例
-
java通过共享变量结束run停止线程的方法示例
-
Java多线程Atomic包操作原子变量与原子类详解
-
java中静态变量和实例变量的区别详细介绍
-
java中静态变量和实例变量的区别详细介绍