Java语言 static (静态变量、实例变量、局部变量、静态方法)

7人阅读 评论(0) 收藏 举报
分类:

(一)静态变量:线程非安全

   1、静态变量:使用static关键字定义的变量。static可以修饰变量和方法,也有static静态代码块。被static修饰的成员变量和成员方法独立于该类的任何对象。也就是说,它不依赖类特定的实例,被类的所有实例共享。只要这个类被加载,Java虚拟机就能根据类名在运行时数据区的方法区内定找到他们。因此,static对象可以在它的任何对象创建之前访问,无需引用任何对象。

    用public修饰的static成员变量和成员方法本质是全局变量和全局方法,当声明它的类的对象时,不生成static变量的副本,而是类的所有实例共享同一个static变量。

    2、静态变量使用的场景:

    (1)对象间共享值时

    (2)方便访问变量时

    3、静态方法使用注意事项:

    (1)不能在静态方法内使用非静态变量,即不能直接访问所属类的实例变量;

    (2)不能在静态方法内直接调用非静态方法;

    (3)静态方法中不能使用this和super关键字;

    4、验证静态变量的线程安全性:

    (1)从程序执行的图中我们可以看出,执行结果中有错误数据,证明了静态变量是存在资源冲突问题的。

    (2)程序运行结果图: 

    wKioL1XIYiCz51UGABceSj2NUtI169.bmp

    5、结论:静态变量也称为类变量,属于类对象所有,位于方法区,为所有对象共享,共享一份内存,一旦值被修改,则其他对象均对修改可见,故线程非安全


    (二)实例变量:单例时线程非安全,非单例时线程安全

    1、实例变量:实例变量属于类对象的,也就是说,属于对象实例私有,在虚拟机的堆中分配。

    2、验证实例变量的线程安全性:

    (1)从程序截图中,我们可以看到,当为单例模式时,会产生资源冲突,当非单例模式时,则不会产生线程冲突。

    (2)程序运行结果图:

    图1:

    wKioL1XIYl_RoatmABZU8hrY9Ck087.bmp

    图2:

    wKioL1XIYpzTOhE2ABZK5iG2N3I856.bmp

 3、结论:实例变量是实例对象私有的,系统只存在一个实例对象,则在多线程环境下,如果值改变后,则其它对象均可见,故线程非安全;如果每个线程都在不同的实例对象中执行,

则对象与对象间的修改互不影响,故线程安全。

    (三)局部变量:线程安全

     1、局部变量:定义在方法内部的变量。

     2、验证局部变量的安全性:

    (1)从程序截图中可以看出,局部变量在多线程下没有产生资源冲突的问题

    (2)程序运行结果图:

    wKiom1XIYLvxqpwpABZORsRL6uY028.bmp

    3、结论:每个线程执行时都会把局部变量放在各自的帧栈的内存空间中,线程间不共享,故不存在线程安全问题。


    (四)静态方法的线程安全性

     1、静态方法中如果没有使用静态变量,则没有线程安全的问题;

          静态方法内的变量,每个线程调用时,都会新创建一份,不会公用一个存储单元,故不存在线程冲突的问题。

 

查看评论

征服Node.js 7.x视频课程(3):基础知识

本课程主要介绍了Node.js中console对象方法的使用、常用命令以及如何调试Node.js脚本。
  • 2017年04月18日 15:40

全局变量、局部变量、静态变量和实例变量的区别

一、预备知识 虚拟机的存储机制: 栈:用来存放基本类型的变量数据和对象的引用,这部分是虚拟机自动分配和管理的。堆:存放所有new出来的对象。栈中存放对象的引用,堆中存放对象。常量池:存放字...
  • fanxiaobin577328725
  • fanxiaobin577328725
  • 2017-01-27 18:02:27
  • 2790

【Java 基础】Java 局部变量、实例变量、类变量(静态变量)区别

Java 局部变量、实例变量、类变量(静态变量)区别Java 局部变量实例变量类变量静态变量区别局部变量 实例变量 类变量静态变量 伪代码说明 实例变量与类变量区别1. 局部变量:局部变量是类的方法中...
  • u012733519
  • u012733519
  • 2016-06-03 12:24:10
  • 3025

java类中局部变量,实例变量,类/静态变量区别解析

局部变量: 局部变量的方法,构造函数或块中声明。 创建局部变量的方法,构造函数或块时进入,一旦退出方法,构造函数或块中的变量将被销毁。 访问修饰符不能用于局部变量。 局部变...
  • qq_27222801
  • qq_27222801
  • 2016-12-13 16:09:23
  • 295

java线程安全之静态变量、实例变量、局部变量

1. 静态变量:线程不安全 静态变量位于方法区,为所有对象共享,它们共享一份内存,一旦静态变量被修改,其他对象均对修改可见,故线程不安全。 public class Test1 implements ...
  • zdp072
  • zdp072
  • 2016-04-24 10:18:31
  • 446

Python的类方法,静态方法,实例方法,类变量,实例变量,静态变量的总结

Python的类方法,静态方法,实例方法,类变量,实例变量,静态变量的总结在一些博客上面看到说Python没有静态变量,但是静态方法却是有的,这点我也弄的不大清楚,这个例子对于++类方法++,==静态...
  • IMBA123456789
  • IMBA123456789
  • 2017-01-07 01:29:53
  • 485

5.Static ,protect,属性和方法,静态方法(static)和实例方法,JAVA的静态变量、静态方法、静态类

1.方法只能在类里创建,方法不能再方法里面创建。why? 答:从格式和文体上分析:方法是以}结尾的,而方法里的语句都必须是;结尾,所以不能在方法里创建方法。 It's a genaral ...
  • zhuhualoyal
  • zhuhualoyal
  • 2016-10-19 17:45:36
  • 700

多线程与静态方法及其中的局部变量关系

static 方法 方法在该方法所属类型第一次被使用的时候加载、在该类型所在应用程序域卸载的时候卸载、也就是说 static 方法只加载一次、除非整个Domain 被卸载了。而实例方法(非静态方法),...
  • huangmeimao
  • huangmeimao
  • 2016-11-01 10:05:51
  • 766

Java中静态变量,实例变量和局部变量

最近在学Java,刚入门,今天看到了静态变量,实例变量和局部变量,然后想总结yixia...
  • weiyichenlun
  • weiyichenlun
  • 2014-11-18 21:51:42
  • 862

java静态变量与实例变量、静态方法与实例方法的区别

静态变量与实例变量 语法上的区别:静态变量定义前要加关键字static,而实例变量不用 实例变量:当创建一个类的对象时,该对象就会拥有一份属于自己的全部数据成员的副本,又称为实例变量,他...
  • qq_26620955
  • qq_26620955
  • 2017-03-21 11:26:10
  • 135
    个人资料
    持之以恒
    等级:
    访问量: 6478
    积分: 1772
    排名: 2万+
    文章存档
    最新评论