首页 > 首页 > JMM内存模型
2019
03-23

JMM内存模型

一,背景:

JMM内存模型主要是描述java多线程如何与内存进行交互,屏蔽各个系统与内存交互的差异,以实现Java在各个平台上访问一致的效果

二,定义:
        多线程通信分内存模型和消息通知模型
        JAVA中多线程通信是使用内存模型,而JMM定义了主内存(寄存器,缓存行等),所有共享变量(静态变量,实例变量)都放在主内存,为提高线程执行效率,为每个线程单独分配了工作内存当线程执行时从主内存获取数据,执行完再写入主内存。
       三,围绕多线程特性进行规范:
        1.原子性
           提供互斥操作保证每个操作都是原子不可中断的,在多线程下也是不可中断的(synchronized,lock)
        2.可见性
           当一个线程修改共享变量后,其它线程对其立马可见(synchronized,volatile)
         3.顺序性
          由于编译器,处理器会对指向指令进行重排序,在多线程情况下会出现执行结果不一致,故JMM定义了  happens-before先行原则)来禁止指令重排
       四,指令重排
        在执行程序时,编译器和处理器会对执行指令进行重排序,以提高在多核环境下指令的执行性能。
        指令重排分为三种/(指令级重排和内存系统重排统称为处理器重排):
        编译器:在程序编译阶段在不改变单线程语义下进行指令重排。
        指令级重排:在多核处理器技术下,多个指令不存在数据依赖时会进行指令重排。
        内存系统重排:在缓存和读取、写入缓存区时,多个数据的加载/存储会存在指令乱序。
        [源代码]->[编译器重排]->[指令系统重排]->[内存系统重排]->[最终执行的指令]
         JMM对指令重排的实现:要求在JVM编译器生成指令序列时,插入特定的内存屏障来禁止特定类型的处理器进行重排序。
         JMM属于语言级别的内存模型,它确保在不同编译器不同平台上,通过禁止特定类型的重排序来达到程序的一致及内存可见性保证。

最后编辑:
作者:noname
noname
这个作者貌似有点懒,什么都没有留下。

留下一个回复

你的email不会被公开。