关于final域,编译器和处理器遵循2个重排序规则: 1,在构造函数内部,对final域的成员变量的写入,与随后将这个被构造的对象赋值给另一个引用变量,这2个操作不能重排序 2,初次读一个包含final域的对象的引用,与随后读这个final域,这2个操作之间不能重排序. 上面的重排序规则能保证,在对 ...
分类:
编程语言 时间:
2017-06-21 14:13:13
阅读次数:
230
对于final域为引用类型的情况: 1,在构造函数内,对于一个final域为引用类型及对其引用的对象的成员变量的写入,与随后在构造函数外将被构造的对象赋值给另一引用变量,这2个操作不能被重排序. 如下图详解: ...
分类:
编程语言 时间:
2017-06-21 13:53:00
阅读次数:
145
第16章 Java内存模型 终于看到这本书的最后一章了,嘿嘿,以后把这本书的英文版再翻翻。这本书中尽可能回避了java内存模型(JMM)的底层细节,而将重点放在一些高层设计问题,例如安全发布,同步策略等。它们的安全性都来自于JMM。本章将介绍Java内存模型的底层需求以及所提供的保证。 16.1 什 ...
分类:
移动开发 时间:
2017-06-14 20:13:41
阅读次数:
205
并发简史 早期的计算机没有操作系统,它们从头到尾只能单独执行一个程序,改程序独占所有资源,由于当时计算机资源比较稀缺和昂贵,所以存在着大量的资源浪费。操作系统的出现改变了这一现状,它让各个程序在独立的进程中运行,为各个独立运行的进程分配各种资源。 之所以提供操作系统来实现多个程序同时执行,主要基于以 ...
分类:
其他好文 时间:
2017-06-11 20:19:38
阅读次数:
132
1. 前言 单例(Singleton)应该是开发者们最熟悉的设计模式了,并且好像也是最容易实现的——基本上每个开发者都能够随手写出——但是,真的是这样吗? 作为一个Java开发者,也许你觉得自己对单例模式的了解已经足够多了。我并不想危言耸听说一定还有你不知道的——毕竟我自己的了解也的确有限,但究竟你 ...
分类:
编程语言 时间:
2017-06-09 15:16:02
阅读次数:
230
摘要 Volatile是Java提供的一种弱同步机制,当一个变量被声明成volatile类型后编译器不会将该变量的操作与其他内存操作进行重排序。在某些场景下使用volatile代替锁可以减少代码量和使代码更易阅读。 Volatile特性 1.可见性:当一条线程对volatile变量进行了修改操作时, ...
分类:
编程语言 时间:
2017-06-06 14:17:13
阅读次数:
155
volatile有以下作用: 阻止重排序,保证可见性,对于单次读写保证原子性(不包括i++这种复合操作)。 下面分别予以解释。 众所周知(也许有些人不知道),编译器以及CPU会在不影响串行结果的情况下对代码进行重排序,以便加快执行速度。(比如超标量流水线计算) 这在并发执行中会造成一些问题。以单例模 ...
分类:
编程语言 时间:
2017-06-05 00:24:50
阅读次数:
142
除了在硬件上增加告诉缓存之外,为了使得处理器内部的运算单元能尽量被充分利用,处理器可能会对输入代码进行乱序执行(Out-Of-Order Execution)优化,处理器会在计算之后将乱序执行的结果重组,保证该结果与顺序执行的结果一致,但并不保证程序中各个语句计算的先后顺序与输入代码中的顺序一致,因 ...
分类:
编程语言 时间:
2017-05-27 10:34:27
阅读次数:
213
java两个线程互相访问的时候并不能按照你的思路运行,因为执行语句可能有前后快慢之分,比如a=1和flag=true。下面线程B访问的时候 这两个赋值语句不一定按顺序执行 产生这种原因是因为指令重排序造成的。这种重排只会出现在不影响串行的结构下进行指令的优化(去掉等待的气泡,这是一种编译器的自动优化 ...
分类:
编程语言 时间:
2017-05-21 14:56:16
阅读次数:
298
Java内存模型与线程Java内存模型与线程
Start
硬件的效率与一致性
Java内存模型
主内存与工作内存
内存间交互操作
对于volatile型变量的特殊规则
可见性
禁止指令重排序优化
对于...
分类:
编程语言 时间:
2017-05-14 18:01:31
阅读次数:
628