【多线程】——JAVA 内存模型(内存结构、内存模型、对象模型、重排序)

从 Java 代码到 CPU 指令

从 java 代码到 CPU 指令

  源文件被编译成字节码后就与平台无关了,这也是 java 的特性之一。JVM 会把字节码转换为机器指令,机器指令可以在 CPU 上运行,也就是最终的程序执行。

JVM 内存结构 vs Java 内存模型 vs Java 对象模型

JVM 内存结构

  JVM 内存结构与 java 虚拟机的运行时区域有关。


JVM 内存结构
  • 绿色区域:方法区和堆是各个线程共享的。
  • 黄色区域:java 栈、本地方法栈和程序计数器是各个方法私有的。

  堆是运行时占用区域最大的一块儿,也是占用内存最多的。通过 new 或者其他指令创建的实例对象存储在堆(Heap)中,如果这些对象不再被引用,会被垃圾回收。数组也包含在内,java 中数组也是对象。堆的优势在于运行时会动态分配,没有必要事先指定大小。

虚拟机栈

  即 java 栈,虚拟机栈中保存了各个基本的数据类型,以及对于对象的引用。编译时就确定了大小。

方法区

  方法区存储已经加载的 static 静态变量或者类信息或常量信息,以及永久引用。

本地方法栈

  本地方法栈保存本地方法相关,主要指的 native 方法。

程序计数器

  保存当前线程所执行的字节码的行号数,上下文切换时的数据也会被保存,异常、循环指令等也依赖程序计数器。

Java 对象模型

  java 对象模型,和 java 对象在虚拟机中的表现形式有关。java 是面向对象的,每一个对象在 Jvm 的存储是有一定结构的。


java 对象模型

  

JMM

  JMM 全称为 Java Memory Model,即 Java 内存模型。由于不同处理器的内存处理结果不一样,因此无法保证并发安全。因此 java 给出了一个标准,使得多线程的运行结果处于可预期的状态,无论处理器是什么样,都能达成统一,使得处理结果一致。
  JMM 除了是上述的一种规范外,它还是关键字的原理。volatile、synchronized 和 lock等底层实现原理都是 JMM。

重排序

public class OutOfOrderExecution {
    private static int x=0,y=0;
    private static int a=0,b=0;

    public static void main(String[] args) throws InterruptedException {
        Thread thread1 = new Thread(() -> {
            a = 1;
            x = b;
        });
        Thread thread2 = new Thread(() -> {
            b = 1;
            y = a;
        });
        thread1.start();
        thread2.start();
        thread1.join();
        thread2.join();
        System.out.println("x=" + x + ",y=" + y);
    }
}

  上面这段代码根据其运行顺序的不同可能出现 3 种结果:

  • thread1 先运行:x=0,y=1;
  • thread2 先运行:x=1,y=0;
  • thread1 的第一行和 thread2 的第一行先运行:x=1,y=1。
      但是,如果执行多次就会发现,还会出现 x =0,y=0 的情况,这时,线程内部的代码顺序发生了改变,即先给 x 和 y 赋值,再给 a 和 b 赋值。
      重排序:线程内部代码的执行顺序和 java 中代码的编码顺序不一致,代码指令并不是严格按照代码语句顺序执行的。

好处

  • 重排序后会对代码指令进行优化,提高运行速度

重排序的三种情况

  • 编译器优化:包括 JVM、JIT 编译器,处于优化目的进行重排序。
  • CPU 指令重排:就算编译器不发生重排序,CPU 也会发生指令的重排序,通过乱序达到效率提升。
  • 内存的“重排序”:线程 A 的修改线程 B 看不到,引出可见性问题。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,332评论 5 475
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,930评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,204评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,348评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,356评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,447评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,862评论 3 394
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,516评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,710评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,518评论 2 318
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,582评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,295评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,848评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,881评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,121评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,737评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,280评论 2 341

推荐阅读更多精彩内容