博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
静态变量、实例变量、局部变量与线程安全
阅读量:4548 次
发布时间:2019-06-08

本文共 1091 字,大约阅读时间需要 3 分钟。

静态变量:线程非安全。

加static关键字的变量,只能放在类里,不能放到方法里

静态变量有默认初始化值。

静态变量表示所有实例共享的一个属性,位于方法区,共享一份内存,而成员变量是对象的特殊描述,不同对象的实例变量被分配在不同的内存空间,一旦静态变量被修改,其他对象均对修改可见,故线程非安全。

 

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

成员变量(实例变量):

1、成员变量定义在类中,即类中的普通变量,在整个类中都可以被类中方法所访问(如过和局部变量重名,需用this关键字)。
2、成员变量随着对象的建立而建立,随着对象的消失而消失,存在于对象所在的堆内存中
3、成员变量有默认初始化值

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

 

成员变量和类变量的区别:

1、两个变量的生命周期不同
成员变量随着对象的创建而存在,随着对象的回收而释放。
静态变量随着类的加载而存在,随着类的消失而消失,且优先于对象存在。
2、调用方式不同
成员变量只能被对象调用。
静态变量可以被对象调用,还可以被类名调用。
3、数据存储位置不同
成员变量存储在堆内存的对象中,是对象的特有数据。
静态变量数据存储在方法区(共享数据区)的静态区
static还可以修饰方法,静态方法只能访问静态变量,不可以访问成员变量,因为静态方法加载时,优先于对象存在,所以没有办法访问对象中的成员。同时静态方法中不能使用this,super关键字,因为this代表当前对象,而静态方法在时,有可能没有对象,所以this无法使用。 

 

 

局部变量:线程安全。

1、局部变量只定义在局部范围内,如:函数内,for循环语句内等,只在所属的区域有效。
2、局部变量存在于栈内存中,作用的范围结束,变量空间会自动释放。
3、局部变量没有默认初始化值
4、在使用变量时需要遵循的原则为:就近原则,先找局部变量,再找实例变量(如果同名,实例变量需要用this关键字引用)
5、局部变量不能逐级重名,比如函数内定义过一个变量,就不能在for循环内定义相同的变量(两层for循环一个用i一个用j也是这个道理)

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

转载于:https://www.cnblogs.com/tonyluis/p/5549149.html

你可能感兴趣的文章
正则表达式语法 2
查看>>
c# winform 应用程序根据条件阻止窗口关闭
查看>>
转载:简单的php写入数据库类
查看>>
垂直居中的几种实现方法
查看>>
UILabel标签文字过长时的显示方式
查看>>
H5离线缓存机制-manifest
查看>>
[学习笔记]BSGS
查看>>
NHibernate 01 [简述]
查看>>
EL表达式浅析以及使用场景
查看>>
Android数据库高手秘籍(一)——SQLite命令
查看>>
[Oracle] 分析功能(1)- 语法
查看>>
Android ViewPager使用具体解释
查看>>
UNIX下改动时间简单一例
查看>>
秒杀多线程第四篇 一个经典的多线程同步问题
查看>>
局域网共享磁盘或文件夹访问
查看>>
LINUX 必知必会检测表--通读无关语言
查看>>
关于iOS和OS X废弃的API你需要知道的一切
查看>>
WEBI 中的参数传递
查看>>
IOS知识小记
查看>>
Memecached缓存原理及基本操作、分布式(一致性hash)
查看>>