Java内存模型

Java内存模型

物理硬件高速缓存

    1.概念:将运算需要使用到的数据复制到缓存中,让运算能快速运行,当运算结束后再从缓存同步回内存之中,这样处理器就无须等待处理缓慢的内存读写了。

    2.产生原因:绝大多数的运算任务都不可能只靠处理器“计算”来完成,处理器至少要和内存交互,如读取运算数据、存储运算结构等。这个I/O操作是很难消除的(无法仅依靠寄存器来完成所有计算任务)。由于计算机的存储设备与处理器的运算速度有几个数量级的差距,所以现代计算机系统都不得不加入一层读写速度尽可能接近处理器运算速度的高速缓存来作为内存与处理器之间的缓冲。就是为了更快点而已!
    3.副作用:
        基于高速缓存交互很好地解决了处理器与内存的速度矛盾,但是也为操作系统带来了更高的复杂度,因为它引入了一个新的问题:缓存一致性(Cache Coherence)。在多处理器系统中,每个处理器都有自己的高速缓存,而它们又共享一片主内存(Main Memory)。当多个处理器的运算任务都涉及到同一块主存储区域时,可能会导致各自的缓存数据不一致,如果真的发生这种情况,那同步回主内存中的数据以谁的为准呢?为了解决一致性的问题,需要各个处理器访问缓存时都遵循一些协议,在读写时要根据协议来进行操作,这类协议有MSI、MESI、MOSI、Synapse、Firefly、以及Protocol。

    
内存模型
    1.概念:在特定的操作协议下,对特定的内存或者高速缓存进行读写访问的过程抽象。
    2.主内存和工作内存
        Java内存模型的主要目标是定义程序中各个变量的访问规则,即在虚拟机中将变量存储到内存和从内存中取出变量这样的底层细节。此处的变量(Variables)与Java编程中所说的变量有所区别,它包含了实例字段、静态字段和构成数组对象的元素,但不包括局部变量与方法参数。因为后者是线程私有的(Reference类型存储在局部变量表中,所以也是线程私有的),不会被共享,所以就不存在竞争问题。
        Java内存模型规定了所有的变量都存储在主存储(Main Memory)中(此处的主内存与物理硬件的主内存名字一样,两者可以互相类比,但此处仅是虚拟机内存的一部分)。每条线程中还有自己的工作内存(Working Memory,可以与上面的物理高速缓存类比),线程的工作内存中保存了被该线程使用到的变量的主内存副本拷贝,线程对变量的所有操作(读取,赋值等)都必须在工作内存中进行,而不能直接读取主内存中的变量,不同线程之间也无法直接访问对方工作内存中的变量,线程间变量值的传递均需要通过主内存来完成,线程、主内存、工作内存三者的交互关系如下图:

    


发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注