美文网首页
(转)线程中哪些变量存在安全性问题

(转)线程中哪些变量存在安全性问题

作者: 小北觅 | 来源:发表于2018-11-08 19:50 被阅读74次

转自Java多线程中static变量的使用

线程,是我们项目中绕不过的重点领域。提到线程,就常会听到线程安全的术语。那什么是线程安全呢?通俗点说,就是线程访问时不产生资源冲突。其实,这是一个有点难以定义的概念,不是很容易让人一听就懂的概念。“一个类可以被多个线程安全调用就是线程安全的”《java编程并发实践》。

来说说静态变量、实例变量、局部变量在多线程下的安全问题吧!

关注公众号: “Java不睡觉”, 回复:“资源”。获取大数据全套视频和大量Java书籍

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

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

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

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

(1)对象间共享值时

(2)方便访问变量时

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

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

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

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

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

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

(2)程序运行结果图:

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

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

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

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

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

图2:


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

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

1、局部变量:定义在方法内部的变量。
2、验证局部变量的安全性:
(1)从程序截图中可以看出,局部变量在多线程下没有产生资源冲突的问题
(2)程序运行结果图:


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

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

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

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

以上就是对多线程环境下静态变量、实例变量和局部变量的一点点研究,也仅供自己在需要或遗忘的时候查询参考下了。

相关文章

  • (转)线程中哪些变量存在安全性问题

    转自Java多线程中static变量的使用 线程,是我们项目中绕不过的重点领域。提到线程,就常会听到线程安全的术语...

  • 58(5.3)

    53分钟。 线程和进程区别 Java的线程安全 什么是线程安全,如何保障。哪些变量是线程安全。 Java IO 分...

  • 第2章 并发编程的其他基础知识

    目录 并行与并发区别 Java中的线程安全问题 Java中共享变量的内存可见性问题 synchronized关键字...

  • 多线程如何实现同步-多线程之间通讯

    一. 什么是线程安全问题 多线程同时对同一个全局变量做写的操作,可能会受到其他 线程的干扰,就会发生线程安全性问题...

  • 07.安全性、活跃性以及性能问题

    并发编程中主要的三个问题:安全性问题,活跃性问题和性能问题. 安全性问题 平时总是听到这个方法不是线程安全的,这个...

  • Java之——多线程中的Synchronized和volatil

    1、Synchronized关键字 1、方法中的变量不存在非线程安全问题,都是线程安全的。 2、两个线程访问同一个...

  • (5)lua脚本

    1.redis的面临问题 原子性问题 redis虽然是单一线程的,当时仍然会存在线程安全问题,当然,这个线程安全问...

  • volatile#synchronized

    可见性原子性有序性 多线程三原则 volatile(不能修饰局部变量) 并发中存在可见性问题,volatile可以...

  • 2.1.2实例变量非线程安全

    2.1.2实例变量非线程安全 如果多个线程共同访问1个对象中的实例变量,则有可能出现“非线程安全”问题。 程序运行...

  • 02.线程安全性问题

    [TOC] 安全性问题概述 什么是安全性问题 多线程情况下的安全问题,是指数据的一致性问题,在多线程环境下,多个线...

网友评论

      本文标题:(转)线程中哪些变量存在安全性问题

      本文链接:https://www.haomeiwen.com/subject/dfhgxqtx.html