Java内存模型(JMM)

JAVA内存模型概述

Java内存模型本身是一种抽象的概念,描述的是一组规则或规范,通过这组规范定义了程序中各个变量的访问方式。

由于JVM运行程序的实体是线程,而每个线程创建时JVM都会为其创建一个工作内存(栈空间),用于存储线程私有的数据,每个线程只能访问自己的工作内存。

JMM中规定,所有变量都存储在主内存中,主内存是共享内存区域,所有的线程都可访问,但线程对变量的操作(读取赋值等)必须在工作内存中进行。首先将变量从主内存中拷贝到自己的工作内存空间,然后对变量进行操作,操作完成后再将变量写回主内存,不能直接操作主内存中的变量,线程之间的通信必须通过主内存来完成。

线程、工作内存和主内存的交互

主内存和工作内存的数据存储类型以及操作方式:

对于一个实例对象中的成员方法而言,如果方法中包含本地变量是基本数据类型,那么将直接存储在工作内存的桢栈结构中,但如果本地变量是引用类型,那么该变量的引用会存储在功能内存的桢栈中,而对象的实例将存储在主内存(堆)中。

对于实例对象的成员变量,不管是什么类型,都会被存储到堆区。

至于static变量及类本身相关信息将会存储在主内存中。


硬件内存架构和JMM

在CPU 内部,有一组CPU寄存器,是一个临时存放数据的空间,供CPU直接访问和处理数据。

一般CPU都会从内存取数据到寄存器,然后进行处理,但由于内存的处理速度远远低于CPU,导致CPU在处理指令时往往花费很多时间在等待内存做准备工作,于是在寄存器和主内存间添加了CPU缓存

CPU缓存可以把从内存中提取的数据暂时保存起来,如果提取的数据中包含CPU需要处理的数据,那么直接会从缓存中读取到寄存器中,无需从内存中读取,这个现象叫做缓存的命中率。当CPU需要写数据到主内存中时,同样会先刷新寄存器中的数据到CPU缓存,然后再把数据刷新到主内存中。


硬件内存架构

JMM三大特性

原子性:指一个操作是不可中断的,即使在多线程的环境下,一个操作一旦开始就不会被其他线程影响。

可见性:指当一个线程修改了某个共享变量的值,其他线程能否马上得知修改后的值。

有序行:是指对于单线程的执行代码,我们总是认为代码是按顺序依次执行的。

JMM提供的解决方案:对于方法级别或者代码块级别的原子性操作,可以使用synchronized关键字或者重入锁(ReentrantLock)保证程序执行的原子性。而工作内存与主内存同步延迟现象导致的可见性问题,可以使用synchronized 或者volatile解决。对于指令重排导致的可见性问题,使用volatile 的禁止指令重排



转自:http://blog.csdn.net/javazejian/article/details/72772461

你可能感兴趣的:(Java内存模型(JMM))