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并发编程的艺术

posted on 2018-09-21 17:54  爪哇玛咖  阅读(456)  评论(0编辑  收藏  举报

导航