大家好,今天小编关注到一个比较有意思的话题,就是关于j***a语言静态变量分配的问题,于是小编就整理了5个相关介绍j***a语言静态变量分配的解答,让我们一起看看吧。
- 静态变量和局部变量的区别?
- static全局变量与普通的区别,局部变量呢? 函数呢?
- C语言:各函数内部定义的静态局部变量可否同名?
- 静态变量和全局变量的区别?
- Java线程安全问题指的是全局变量,还是静态变量?
静态变量和局部变量的区别?
局部变量:
1.局部变量定义在局部范围内:如方法,函数,语句中,只在作用域有效
2.局部变量没有默认初始化值
3.局部变量存在于栈内存中,作用的范围结束,变量空间会自动释放
静态变量:
用static关键字修饰的变量,被所有对象所共享
static全局变量与普通的区别,局部变量呢? 函数呢?
static全局变量是所有程序都能访问,普通的是类内部可以访问,静态变量变量赋值后会一直存在,除非应用程序重启或回收值才会失效,静态变量都是单例模式在多线程下会有线程安全问题,造成变量污染。
静态函数是不用实例化类就可以直接调用,静态方法是没有线程安全问题的,是安全的。
C语言:各函数内部定义的静态局部变量可否同名?
可以、、 静态局部变量在函数调用结束后仍然存在,及它的内存空间不会被释放,但其他函数是不能引用它的。因为它是局部变量,只能被本函数引用,而不能被其他函数引用。所以你在其他函数中命名一个同名的变量是不冲突的、、
静态变量和全局变量的区别?
全局变量声明之前加上static,就是静态全局变量。全局变量和静态全局变量都是静态存储的;在存储上无区别。区别在于他们的作用域;全局变量的作用域是整个源程序,当源程序有多个源文件组成时,全局变量在各个源程序文件都是有效的;而静态全局变量怎被限制了作用域,只在定义该变量的源文件内有用在同一程序的其他源文件不能使用!还有静态全局变量只初始化一次,防止在其他源文件调用!而全局变量可以再其他源文件初始化!!这样说楼主明白了吗?
全局变量声明之前加上static,就是静态全局变量。全局变量和静态全局变量都是静态存储的;在存储上无区别。区别在于他们的作用域;全局变量的作用域是整个源程序,当源程序有多个源文件组成时,全局变量在各个源程序文件都是有效的;而静态全局变量怎被限制了作用域,只在定义该变量的源文件内有用在同一程序的其他源文件不能使用!还有静态全局变量只初始化一次,防止在其他源文件调用!而全局变量可以再其他源文件初始化!!这样说楼主明白了吗?
J***a线程安全问题指的是全局变量,还是静态变量?
这个问题的答案是静态变量和全局变量都可能引起线程安全问题。这两种变量引起线程安全问题的原因和区别如下:
1、静态变量
静态变量即静态成员变量。只要有修改变量值的操作,无论是在单例或者非单例都是线程不安全的;而如果线程只是读取变量的值,而不会改变变量的值,这种情况下则是线程是安全的。
产生线程安全问题的原因:静态变量即类变量,只初始化一次,位于方法区,为所有对象共享,共享一份内存,一旦静态变量被修改,其他对象均对修改可见,故线程非安全。
静态变量多线程操作示例:
根据上图代码可知,当线程1执行了number = 1; number = 2; 后,线程2获得执行权,number = 1;然后当线程1获得执行权执行打印第二次获取number时; 必然输出结果“获取第二次number = 1”,按照这个模拟,我们可能会在控制台看到输出为“获取第二次number = 1”的结果。如下图方框中的数据:
上图结果显示了静态变量线程不安全问题。
2、全局变量
全局变量即实例成员变量。如果线程只是读取变量的值,而不会改变变量的值,则无论是单例还是非单例都是线程安全的;如果有修改变量值的操作,则单例模式因为只有一个对象实例singleton存在,多线程同时操作时是不安全的,而非单例模式下多线程操作是安全的。
实例变量为对象实例私有,在虚拟机的堆heap中分配,若在系统中只存在一个此对象的实例,在多线程环境下,“犹如”静态变量那样,被某个线程修改后,其他线程对修改均可见,故线程非安全(如,springmvc controller是单例的,非线程安全的);如果每个线程执行都是在不同的对象中,那对象与对象之间的实例变量的修改将互不影响,故线程安全(如,struts2 action默认是非单例的,每次请求在heap中new新的action实例,故struts2 action可以用实例成员变量)。
全局变量多线程操作示例:
多线程操作同一个对象的全局变量,结果如下图:
上图结果显示了全局变量线程不安全问题。
到此,以上就是小编对于j***a语言静态变量分配的问题就介绍到这了,希望介绍关于j***a语言静态变量分配的5点解答对大家有用。