• Java多线程学习之路(1) -- 内存可见性


    什么叫内存可见性
        一个线程对共享变量值的修改,能够及时的被其他线程看到。
    什么又叫共享变量
        如果一个变量在多个线程的工作内存中都存在副本,那么这个变量就是这几个线程的共享变量
        Java中,所有例域、静域和数元素都存在堆内存中,堆内存在线程之共享。
        局部量(Local Variables),方法定参数和异常理器参数(不会在线程之共享,它不会有内存可问题,也不受内存模型的影响 
        对于Java内存模型,线程间的共享变量存储在主内存中,不同线程会在本地内存中,各自创建共享变量的副本。
    直白点就是,两个线程A和B进行通信时,线程会在本地对变量x进行操作,操作后会将更新后的值刷新到主存,线程B再从主存中读取x的值,并更新到本地内存。
     
     
     以下内容是对这句话的详解
    Java线程之的通信由Java内存模型(本文JMM)控制,JMM决定一个线共享量的写入何时对另一个线程可。从抽象的角度来看,
    JMM线程和主内存之的抽象关系:线程之的共享量存在主内存(Main Memory)中,每个线程都有一个私有的本地内存(Local Memory),
    本地内存中存该线程以/写共享量的副本。本地内存是JMM的一个抽象概念,并不真存在。它涵盖了存、写冲区、寄存器以及其他的硬件和编译
    化。Java内存模型的抽象示意如3-1所示。

    3-1来看,如果线A线B要通信的,必经历下面2个步
    1线A把本地内存A中更新的共享量刷新到主内存中去。
    2线B到主内存中去线A之前已更新的共享量。
    下面通示意见图3-2)来两个步
    内存可见性

    3-2所示,本地内存A和本地内存B由主内存中共享x的副本。假初始3
    内存中的x0线A,把更新后的x(假设值为1临时存放在自己的本地内存
    A中。当线A线B需要通信线A首先会把自己本地内存中修改后的x刷新到主内
    存中,此主内存中的x值变为1。随后,线B到主内存中去线A更新后的x,此
    线B的本地内存的x变为1
    从整体来看,两个步骤实质上是线A在向线B送消息,而且个通信程必
    经过主内存。JMM控制主内存与每个线程的本地内存之的交互,来Java程序提供
    内存可性保
     
     
    参考资料--java并发编程的艺术

  • 相关阅读:
    Apache https 证书配置...
    npm 安装 sass=-=-=
    mysql 8.0 安装
    『转』谷歌发布Windows版Chrome App Launcher
    VMware Workstation 10.0.0.1295980 CN
    16款最受关注的智能手表 苹果iWatch领衔
    百度网盘推荐部分优秀的分享达人
    『转』市售热门可穿戴式“活动追踪器 Tracker”导购指南
    各网盘活动地址及点评-14.03.28
    2014.01.07_自用软件-春运开始了....
  • 原文地址:https://www.cnblogs.com/coisini/p/9687798.html
Copyright © 2020-2023  润新知