这个问题的答案是静态变量和全局变量都可能引起线程安全问题。这两种变量引起线程安全问题的原因和区别如下:

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可以用实例成员变量)。

全局变量多线程操作示例:

多线程操作同一个对象的全局变量,结果如下图:

上图结果显示了全局变量线程不安全问题。

java 全局变量线程安全_Java线程安全问题指的是全局变量,还是静态变量?相关推荐

  1. java 同步转并行_Java线程与并行编程(二)

    你好,我是goldsunC 让我们一起进步吧! 线程的控制与同步 线程的状态与生命周期 '每个Java程序都有一个默认的主线程,想要实现多线程,必须在主线程中创建新的线程对象.新建的线程在它的一个完整 ...

  2. java io密集型任务_Java线程池讲解——针对IO密集型任务

    sap java开发技术详解&mdash基础 94.01元 (需用券) 去购买 > 针对 IO 密集型的任务,我们可以针对原本的线程池做一些改造,从而可以提高任务的处理效率. 基本 在阿 ...

  3. java 线程安全性_Java线程安全性问题摘要_Power Node Java Academy的组织

    在Java内存模型上 不同的平台,内存模型不同,但是jvm内存模型规范是统一的. 实际上,Java的多线程并发问题最终将反映在Java的内存模型中. 所谓的线程安全无非是控制多个线程对多个资源的有序访 ...

  4. java线程 属性_Java 线程基础

    本文部分摘自<Java 并发编程的艺术> 线程简介 1. 什么是线程? 现代操作系统在运行一个程序时,会为其创建一个进程,一个进程里可以创建多个线程.现代操作系统调度的最小单元是线程,也叫 ...

  5. java线程触发_java线程

    线程. 状态 新建状态(New): 当用 new 操作符创建一个线程时, 例如 new Thread(r),线程还没有开始运行,此时 线程处在新建状态. 当一个线程处于新生状态时,程序还没有开始运行线 ...

  6. java 线程状态_JAVA线程漫谈:线程状态与状态转换解析

    线程使用方式 JDK线程的顶层抽象是Runnable接口,本质上,线程相关的类都是基于Runnable和Thread实现类实现. JDK API级别有不同的创建线程的方式,但本质是还是基于Runnab ...

  7. java线程分类_Java 线程类别

    Java 线程类别 守护线程和非守护线程 守护线程和非守护线程之前的唯一区别在于:是否阻止JVM的正常退出. JVM正常退出是与异常退出相对的概念,异常退出如调用System.exit(status) ...

  8. idea 线程内存_Java线程池系列之-Java线程池底层源码分析系列(一)

    课程简介: 课程目标:通过本课程学习,深入理解Java线程池,提升自身技术能力与价值. 适用人群:具有Java多线程基础的人群,希望深入理解线程池底层原理的人群. 课程概述:多线程的异步执行方式,虽然 ...

  9. idea 线程内存_Java线程池系列之-Java线程池底层源码分析系列(二)

    课程简介: 课程目标:通过本课程学习,深入理解Java线程池,提升自身技术能力与价值. 适用人群:具有Java多线程基础的人群,希望深入理解线程池底层原理的人群. 课程概述:多线程的异步执行方式,虽然 ...

最新文章

  1. 给力的 Google HTML5 训练营(HTML5 DragDrop 拖拽、FileRea...
  2. 卡迪夫大数据专业排名_大数据揭秘!英国名校哪些专业录取率低?申请人最多呢?...
  3. Redis数据结构:字典(hash表)
  4. void和void*详解 v2
  5. Css中图片局部放大,将图片中局部放大效果
  6. 直击!10万阿里小二的复工生活
  7. 计算机试题dddd,数据库系统概论试题及答案dddd_Image_Marked.pdf
  8. Java hdfs连接池_Java使用连接池管理Hdfs连接
  9. 如何用sbt新建akka项目
  10. NetAug(网络增强)—Dropout的反面
  11. mysql 字符串的hash函数_【转载】字符串Hash函数比较
  12. 2021-08-30
  13. 新网站收录及备忘录网址
  14. cpu,内存占用率过高解决方法
  15. 摄像头拍摄视频,保存视频,并将视频保存为图片
  16. 医院病历管理系统java版本二
  17. Qt在线帮助文档网址以及安装包下载地址
  18. 光遇为什么显示服务器连接错误,光遇服务器错误怎么办 光遇服务器错误问题解决办法-游侠手游...
  19. Spring AOP原理及使用,面试必备
  20. linux rapidio测试,Linux 下RapidIO 子系统的分析与实现.pdf

热门文章

  1. Halcon边缘提取之高斯导数卷积图像——derivate_gauss.hdev
  2. 关系数据库理论-范式
  3. 关于opencv使用CAP_PROP_FPS得到的摄像头帧率为0的解答和解决方案
  4. 在Maya2017中玩俄罗斯方块
  5. 股行者【龙虎榜小红牛分析系统5.4】发布时间2020年06月29日
  6. Unity大型地图切割
  7. 电脑系统Windows11安全中心内存完整性打开不了怎么办
  8. Orleans 简介
  9. Maximizing Depth Buffer Range and Precision
  10. Java数组(二维数组)