轉:https://blog.csdn.net/yy304935305/article/details/52456771php
鲁迅先生曾说过:“时间就像海绵里的水,只要愿挤,总仍是有的”。无论肿(怎)么说,这事仍是要作的啊。若是越日后推,可能形成的潜在影响更大。这始终是个隐患,不能不除。html
不是痛定思痛,而是认识到事情的重要性,就要开始行动了... ...java
以上是我的的闲言碎语,不足而看。下面,咱们就少言几句进入到技术领域吧!编程
线程,是咱们项目中绕不过的重点领域。提到线程,就常会听到线程安全的术语。那什么是线程安全呢?通俗点说,就是线程访问时不产生资源冲突。其实,这是一个有点难以定义的概念,不是很容易让人一听就懂的概念。“一个类能够被多个线程安全调用就是线程安全的”《java编程并发实践》。安全
来讲说静态变量、实例变量、局部变量在多线程下的安全问题吧!多线程
(一)静态变量:线程非安全并发
一、静态变量:使用static关键字定义的变量。static能够修饰变量和方法,也有static静态代码块。被static修饰的成员变量和成员方法独立于该类的任何对象。也就是说,它不依赖类特定的实例,被类的全部实例共享。只要这个类被加载,Java虚拟机就能根据类名在运行时数据区的方法区内定找到他们。所以,static对象能够在它的任何对象建立以前访问,无需引用任何对象。app
用public修饰的static成员变量和成员方法本质是全局变量和全局方法,当声明它的类的对象时,不生成static变量的副本,而是类的全部实例共享同一个static变量。ui
二、静态变量使用的场景:this
(1)对象间共享值时
(2)方便访问变量时
三、静态方法使用注意事项:
(1)不能在静态方法内使用非静态变量,即不能直接访问所属类的实例变量;
(2)不能在静态方法内直接调用非静态方法;
(3)静态方法中不能使用this和super关键字;
四、验证静态变量的线程安全性:
(1)从程序执行的图中咱们能够看出,执行结果中有错误数据,证实了静态变量是存在资源冲突问题的。
(2)程序运行结果图:
五、结论:静态变量也称为类变量,属于类对象全部,位于方法区,为全部对象共享,共享一分内存,一旦值被修改,则其余对象均对修改可见,故线程非安全。
(二)实例变量:单例时线程非安全,非单例时线程安全
一、实例变量:实例变量属于类对象的,也就是说,属于对象实例私有,在虚拟机的堆中分配。
二、验证明例变量的线程安全性:
(1)从程序截图中,咱们能够看到,当为单例模式时,会产生资源冲突,当非单例模式时,则不会产生线程冲突。
(2)程序运行结果图:
图1:
图2:
三、结论:实例变量是实例对象私有的,系统只存在一个实例对象,则在多线程环境下,若是值改变后,则其它对象都可见,故线程非安全;若是每一个线程都在不一样的实例对象中执行,
则对象与对象间的修改互不影响,故线程安全。
(三)局部变量:线程安全
一、局部变量:定义在方法内部的变量。
二、验证局部变量的安全性:
(1)从程序截图中能够看出,局部变量在多线程下没有产生资源冲突的问题
(2)程序运行结果图:
三、结论:每一个线程执行时都会把局部变量放在各自的帧栈的内存空间中,线程间不共享,故不存在线程安全问题。
(四)静态方法的线程安全性
一、静态方法中若是没有使用静态变量,则没有线程安全的问题;
静态方法内的变量,每一个线程调用时,都会新建立一份,不会公用一个存储单元,故不存在线程冲突的问题。
以上就是对多线程环境下静态变量、实例变量和局部变量的一点点研究,也仅供本身在须要或遗忘的时候查询参考下了。