码迷,mamicode.com
首页 > 编程语言 > 详细

JAVA内存模型

时间:2016-06-28 23:26:02      阅读:211      评论:0      收藏:0      [点我收藏+]

标签:

http://www.bubuko.com/infodetail-1627377.html

http://www.bubuko.com/infodetail-1627292.html

3.1内存模型基础

  线程通信

         消息传递(显式),共享内存(隐式)

  线程同步

       消息传递(隐式),共享内存(显式)

3.1.2内存模型的抽象结构

      JMM定义了各线程和主内存之间的抽象关系。决定了一个线程对于共享变量的写入何时对另一个线程可见。

      本地内存包含了缓存,写缓冲区,寄存器,以及其他的硬件和编译器优化。

3.1.3从源代码到指令序列的重排序

        编译器重排序(编译器级别)

        指令级并行重排序(处理器级别)   指令并行技术的使用使得指令出现了重排序

        内存系统的重排序 (处理器级别)  cpu可能使用了读/写缓冲区,这使得加载和存储操作看上去是在乱序的执行

       对于编译器,JMM排序规则会禁止特定类型的编译器重排序

      对于处理器,JMM的处理器排序规则会要求JAVA编译器在生成指令序列时,插入特定类型的内存屏障(Memory fence)指令,通过内存屏障指令来禁止特定类类型的处理器

      重排序。

3.1.4并发编程模型的分类

        1、为什么使用写缓存区

           写缓冲区可以保证指令流水线持续运行,它可以避免由于处理器停顿下来等待向内存写入数据而产生的延迟。同时,通过以批处理的方式刷新写缓冲区,以及合并写缓冲区

           中对同一内存地址的多次写,减少对内存总线的占用。每个处理器之间的写缓存区是相互隔离的。使用写缓冲区导致处理器对内存的执行顺序和真正的内存执行顺序是不一

           致的。

       2、x86系列因为处理器的内存模型较强,这款处理器只允许对写-读操作做重排序。

       3、内存屏障指令

          第四个内存屏障指令,具有其他三个所有的效果,一般所有的cpu都支持该内存屏障,其他的三个可能不支持。该屏障需要刷新写缓冲区的所有数据到内存里,所以只需开销

            较大。

3.1.5 happens-before简介

        1、什么是happens-before

            前面的操作的执行结果对后面的操作可见

         2、哪些happens-before

                1、程序顺序规则

                2、监视器锁规则

                3、volitale变量规则    对一个volatile变量的写,happens-before于任意后续的对volatile域的读。

                4、传递性

      3、一个happens-before规则对应于一个或者多各编译器和处理器重排序规则。

3.2重排序

 

 

JAVA内存模型

标签:

原文地址:http://www.cnblogs.com/YDDMAX/p/5625232.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!