内存模型FAQ

先了解下重排序

在很多情况下,访问一个程序变量(对象实例字段,类静态字段和数组元素)可能会使用不同的顺序执行,而不是程序语义所指定的顺序执行。编译器能自由的以优化的名义去改变指令顺序。在特定的环境下,处理器可能会次序颠倒的执行指令。数据可能在寄存器,处理器缓冲区和主内存中以不同的次序移动,而不是按照程序制定的顺序。

例如,如果一个线程写入值到字段a,然后写入值到字段b,而且b的值不依赖于a的值,那么处理器就能自由的调整它们的执行顺序,而且缓冲区能够在a之前刷新b的值到主内存。有很多潜在的重排序的来源,比如:编译器,JIT和缓冲区。

编译器,运行时和硬件被期望一起协力创建好像是顺序执行语义的假象,这意味着在单线程的程序中,程序应该是不能够观察到重排序的影响。但是,重排序在没有正确同步了的多线程程序中开始起作用,在这些多线程中,一个线程能够观察到其他线程的影响,也可能检测到其他线程将会以一种不同于程序语义所规定的执行顺序来访问变量。
大部分情况下,一个线程不会关注其他线程正在做什么,但是当它需要关注的时候,那就需要同步了。

什么是内存模式

  • 在处理器层面上,内存模型定义了充要条件:

让当前处理器可以看到其它处理器写入到内存的数据,以及其他处理器可以看到当前处理器写入到内存的数据。

"一个线程的写操作对其他线程可见" 是因为编译器对代码进行重排序导致的。比如,只要代码移动不改变程序的语义,并且编译器认为程序的一个写操作到后面会更好的时候,编译器就会对代码进行移动。如果编译器推迟一个操作A,其他线程可能在这个操作A执行完成前都看不到该操作A的结果,这反映了缓存的影响。

当写入内存的操作能被移动到程序里更前的时候,其他的线程在程序中可能看到一个比它实际发生更早的写操作。这样灵活性的设计是为了通过给编译器,运行时或硬件灵活性使其能在最佳顺序的情况下执行操作。在内存模型的限定之内,我们能够获取更高的性能。

举例:

ClassReordering{
    int x = 0, y = 0;
    public void writer(){
        x = 1;
        y = 2; 
   }

   public void reader(){
        int r1 = y;
        int r2 = x; 
   }
}

让我们在两个并发线程中执行这段代码,读取Y变量,值是2,因为这个写入比写到X变量更晚一些,你可能认为读取X变量将肯定会得到1。但是,写入操作可能被重排序过。如果重排序发生了,那么写入Y变量后,跟着的就是两个读操作,然后X的写入可能发生了。所以结果可能是r1的值是2,r2的值是0。

Java内存模型描述了:

  • 在多线程里什么行为是合法的,以及线程如何通过内存进行交互。
  • “程序中的变量”和“从内存或者寄存器获取存储它们的底层细节”之间的关系

java内存模型通过使用各种各样的硬件和编译器的优化来正确实现以上事情

java 包含了几个语言级别的关键字,包括:volatile,final和synchronized,目的是为了帮助程序员向编译器描述一个程序的并发需求。Java内存模型定义了volatile和synchronized的行为,更重要的是保证了同步的java程序在所有的处理器架构下面都能正确的运行。

引用链接:http://ifeve.com/jmm-faq/

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

推荐阅读更多精彩内容