美文网首页
JAVA线程共享变量问题

JAVA线程共享变量问题

作者: 白纸糊 | 来源:发表于2019-04-16 15:19 被阅读0次

Java内存模型

为什么出现这种情况呢,我们需要先了解一下JMM(java内存模型)

 java虚拟机有自己的内存模型(Java Memory Model,JMM),JMM可以屏蔽掉各种硬件和操作系统的内存访问差异,以实现让java程序在各种平台下都能达到一致的内存访问效果。

  JMM决定一个线程对共享变量的写入何时对另一个线程可见,JMM定义了线程和主内存之间的抽象关系:共享变量存储在主内存(Main Memory)中,每个线程都有一个私有的本地内存(Local Memory),本地内存保存了被该线程使用到的主内存的副本拷贝,线程对变量的所有操作都必须在工作内存中进行,而不能直接读写主内存中的变量。这三者之间的交互关系如下

image

需要注意的是,JMM是个抽象的内存模型,所以所谓的本地内存,主内存都是抽象概念,并不一定就真实的对应cpu缓存和物理内存。当然如果是出于理解的目的,这样对应起来也无不可。

大概了解了JMM的简单定义后,问题就很容易理解了,对于普通的共享变量来讲,比如我们上文中的status,线程A将其修改为true这个动作发生在线程A的本地内存中,此时还未同步到主内存中去;而线程B缓存了status的初始值false,此时可能没有观测到status的值被修改了,所以就导致了上述的问题。那么这种共享变量在多线程模型中的不可见性如何解决呢?比较粗暴的方式自然就是加锁,但是此处使用synchronized或者Lock这些方式太重量级了,有点炮打蚊子的意思。比较合理的方式其实就是volatile

volatile具备两种特性,第一就是保证共享变量对所有线程的可见性。将一个共享变量声明为volatile后,会有以下效应:

    1.当写一个volatile变量时,JMM会把该线程对应的本地内存中的变量强制刷新到主内存中去;

    2.这个写会操作会导致其他线程中的缓存无效。

相关文章

  • JAVA线程共享变量问题

    Java内存模型 为什么出现这种情况呢,我们需要先了解一下JMM(java内存模型) java虚拟机有自己的内存模...

  • Android多线程(四)

    volatile volatile在Java语言规范中定义 Java编程语言允许线程访问共享变量,为确保共享变量能...

  • 9.2019java内存模型相关

    java内存模型 堆内存是被所有线程共享的运行时内存区域,存在可见性的问题。线程之间共享变量存储在主存中,每个线程...

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

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

  • java并发

    java并发的两个核心问题: 1:线程间如何通信2:线程间如何同步 1:通行通过共享变量,Java内存模型2:同步...

  • 一篇面试了无数公司后总结的面试题,学完面试不上我把工资卡给你

    1、什么是线程局部变量? 线程局部变量是局限于线程内部的变量,属于线程自身所有,不在多个线程间共享。Java 提供...

  • JAVA

    1.4 Java的 内存模型 是否线程安全线程安全与cpu资源的抢夺 多线程在读写共享变量时引发的问题 线程的原子...

  • 《Java并发编程艺术》随笔(一)volatile,synchr

    1、volatile定义:java编程语言允许线程访问共享变量,为了确保共享变量能被准确和一致的更新,线程应该确保...

  • volatile和synchronized

    1. volatile 定义:Java编程语言允许线程访问共享变量,为了确保共享变量能被准确和一致的更新,线程应该...

  • 内存模型

    1.4 Java的 内存模型 是否线程安全线程安全与cpu资源的抢夺多线程在读写共享变量时引发的问题 线程的原子性...

网友评论

      本文标题:JAVA线程共享变量问题

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