指令重排序问题,求大神解答 [问题点数:40分]

Bbs1
本版专家分:0
结帖率 0%
JAVA 基础系列之 重排序和Volatile
<em>重排序</em>在执行程序时,编译器和处理器会对<em>指令</em>进行<em>重排序</em>,<em>重排序</em>分为: 编译器<em>重排序</em>:在不改变代码语义的情况下,优化性能而改变了代码执行顺序; <em>指令</em>并行的<em>重排序</em>:处理器采用并行技术使多条<em>指令</em>重叠执行,在不存在数据依赖的情况下,改变机器<em>指令</em>的执行顺序; 内存系统的<em>重排序</em>:使用缓存和读写缓冲区时,加载和存储可能是乱序执行。 比如现在有一段代码如下:a = 1; //代码1 b = 1; //代码2编译器和处
重排序
<em>重排序</em> <em>重排序</em>是指编译器和处理器为了优化程序性能而对<em>指令</em>序列进行重新排序的一种手段。 1. 数据依赖性 如果两个操作访问同一个变量,且这两个操作中有一个为写操作,此时这两个操作之间就存在数据依赖性。 编译器和处理器在<em>重排序</em>时,会遵守数据依赖性,编译器和处理器不会改变存在数据依赖关系的两个操作的执行顺序。 这里所说的数据依赖性仅针对单个处理器中执行的<em>指令</em>序列和单个线程中执行的操...
JMM--重排序
<em>重排序</em>是什么?重新排序?不可以这么单一的理解。<em>重排序</em>通常是编译器或运行时环境为了优化程序性能而采取的对<em>指令</em>进行重新排序执行的一种手段。<em>重排序</em>分为两类:编译器<em>重排序</em>和运行期<em>重排序</em>,分别对应编译时和运行时环境。不要假设<em>指令</em>执行的顺序,因为根本无法预知不同线程之间的<em>指令</em>会以何种顺序执行。1、首先为何要<em>指令</em><em>重排序</em>(instruction reordering)?编译器或运行时环境为了优化程序性能而采取的对...
JVM(十一)Java指令重排序
一、<em>指令</em><em>重排序</em> 我们先看一下下面的代码会输入 什么样的结果? public class PossibleReordering { static int x = 0, y = 0; static int a = 0, b = 0; public static void main(String[] args) throws InterruptedException { Thread
由Java引起的指令重排序思考
背景 <em>问题</em>出现 在6360灰度期间从Crash平台上看到了一个NullPointerException,虽然量不大,但是很怪异,大致长这个样子 这是个什么空指针?居然说我LinkedList.iterator().hasNext()方法有<em>问题</em>?可是我就是正常的调用hasNext()啊,怎么就抛出来这种异常了呢? <em>问题</em>初分析 调用LinkedList.iterator().h
从 DCL(双重检查锁定)谈 volatile 禁止指令重排序
最近在看《Java并发编程的艺术》,看到双重检查锁定里谈到用 volatile 来解决创建对象时,<em>指令</em><em>重排序</em>的<em>问题</em>,想了解清楚为什么 volatile 可以禁止<em>指令</em><em>重排序</em>,结果得到了出乎意料的答案。
什么是重排序问题
十七、 什么是<em>重排序</em><em>问题</em>Java内存模型中,允许编译器和处理器对<em>指令</em>进行<em>重排序</em>,但是<em>重排序</em>可以保证最终执行的结果是与程序顺序执行的结果一致,并且只会对不存在数据依赖性的<em>指令</em>进行<em>重排序</em>,这个<em>重排序</em>在单线程下对最终执行结果是没有影响的,但是在多线程下就会存在<em>问题</em>。一个例子int a = 1;(1) int b = 2;(2) int c= a + b;(3) 如上c的值依赖a和b的值,所以<em>重排序</em>后能够
java synchronized具有禁止重排序功能
1.结论我们知道volatile关键字具有禁止<em>指令</em><em>重排序</em>的功能,而且能保证可见性,但不能保证原子性。synchronized关键字则不仅仅能保证可见性,还能保证原子性,那么synchronized关键字是否像volatile那样具有禁止<em>指令</em><em>重排序</em>的功能呢?答案是肯定的,synchronized具有禁止<em>重排序</em>功能。2.论据出处查找国内文档,发现基本对synchronized的描述很少提及禁止<em>重排序</em>的问
【死磕Java并发】-----Java内存模型之重排序
在执行程序时,为了提供性能,处理器和编译器常常会对<em>指令</em>进行<em>重排序</em>,但是不能随意<em>重排序</em>,不是你想怎么排序就怎么排序,它需要满足以下两个条件: 1. 在单线程环境下不能改变程序运行的结果; 2. 存在数据依赖关系的不允许<em>重排序</em>如果看过LZ上篇博客的就会知道,其实这两点可以归结于一点:无法通过happens-before原则推导出来的,JMM允许任意的排序。as-if-serial语义as-if-se
并发中的陷阱-处理器重排序
假设有两个线程分别调用同一个test对象的writer()和reader()。请问,console输出的是什么?(a) 0 (b) 1 (c) 不确定 (d) 不知道 public class test{ private boolean flag = false; private int a = 0; public void writer(){ a
JAVA并发理解之重排序问题
       首先我们先来了解一下什么是<em>重排序</em>:<em>重排序</em>是指编译器和处理器为了优化程序性能而对<em>指令</em>序列进行重新排序的一种手段。从Java源代码到最终实际执行的<em>指令</em>序列,会分别经历下面3种<em>重排序</em>,如下图所示      上述的1属于编译器<em>重排序</em>,2和3属于处理器<em>重排序</em>。这些<em>重排序</em>可能会导致多线程程序出现内存可见性<em>问题</em>。在单线程程序中,对存在控制依赖的操作<em>重排序</em>,不会改变执行结果(这也是as-if-ser...
关于JVM的指令重排序
<em>指令</em><em>重排序</em>有两类,编译器<em>重排序</em>和处理器<em>重排序</em>。编译器<em>重排序</em>发生在编译期,处理器<em>重排序</em>发生在运行时。其实<em>指令</em><em>重排序</em>的本意是提高程序并发效率,原则是<em>重排序</em>后的程序运行结果和单线程运行结果一致。 为什么<em>指令</em><em>重排序</em>会提高程序并发效率呢?这里先理解一下CPU的最小调度单位是线程这个概念。首先一个CPU同时只能处理一个线程,在最初单核CPU的时候,是通过轮询的方式去完成多线程的,在线程之间完成上下文切换。随...
重排序
var items = [ {name: "linc", age: 28, num: 1234}, {name: "linc", age: 28, num: 12345}, {name: "kiki", age: 20, num: 12345}, {name: "张三", age: 26, num: 123}, {name: "张三", age: 27, n
多线程之指令重排序
1、首先为何要<em>指令</em><em>重排序</em>(instruction reordering)? 编译器或运行时环境为了优化程序性能而采取的对<em>指令</em>进行重新排序执行的一种手段。 也就是说,对于下面两条语句: int a = 10; int b = 20; 在计算机执行上面两句话的时候,有可能第二条语句会先于第一条语句执行。所以,千万不要随意假设<em>指令</em>执行的顺序。 2、是不是所有的语句的执行顺
Java JVM(十二):指令重排序
介绍<em>指令</em><em>重排序</em>的相关知识。
Java重排序对多线程的影响
上一次的发文远在两个月前了,算是经历了一段低糜期,本来打算的更新一直断更到现在。还是好好学习吧,努力的人运气一定不会差的。这一篇文章来谈一谈Java虚拟机对代码优化带来的影响吧。我们知道无论什么语言,最后驱动计算机的那一定是汇编,Java代码编译后会变成一段字节码,通过Java虚拟机的类加载机制ClassLoader加载到虚拟机里面,最后便是把它转化成汇编<em>指令</em>。通过JMM(Java内存模型)实现内存
深入理解重排序
理解一下数据依赖性    如果有两个操作,访问同一个变量并且有一个操作是写操作,那这两个操作存在数据依赖。     一般有如下几种情况:      1.写后写:a=1;a=2;      2.写后读:a=1;b=a;      3.读后写:b=a;a=1; 如上几种情况都存在依赖关系。存在依赖关系的操作就无法<em>重排序</em>。<em>重排序</em>会导致结果不一致。 例子: if(flag){//1 a
今天来学习下美团推荐算法实践:机器学习重排序模型
转载,来自小象学院。 美团推荐算法实践:机器学习<em>重排序</em>模型 文章介绍了美团推荐系统的构架和优化过程,包括数据层,触发层,融合过滤层和排序层,采用了Hbase,Hive,Storm,Spark和机器学习等技术。两个优化两点将是候选集进行融合与引入<em>重排序</em>模型。 看的到这里顿时觉得高大上了,有木有…… 在用户意图明确时,我们通过用搜索引擎来结局互联网时代的信息过载<em>问题</em>,但当用户的意图不明确的时候或
一文告诉你机器学习中进行模型评价、模型选择和算法选择的终极方法(PART I)
本文为数盟原创译文,转载请注明出处为“数盟社区”。 by Sebastian Raschka  引言  机器学习已经成为我们生活中的一部分,对购买者、消费者或是希望进行研究和实践者都很重要!无论我们应用预测建模技术来进行我们的研究还是解决业务<em>问题</em>,我相信有一个共同点:我们要做“好”的预测!诚然,我们需要训练数据模型,但是我们怎么知道它能很好的在看不见的数据中运行?我们怎么避免它仅
Java并发编程系列之三:重排序与顺序一致性
前言在我们编写程序并运行的时候,编译器给我们一个错觉:程序编译的顺序与编写的顺序是一致的。但是实际上,为了提高性能,编译器和处理器常常会对<em>指令</em>进行<em>重排序</em>。<em>重排序</em>主要分为两类:编译器优化的<em>重排序</em>、<em>指令</em>级别并行的<em>重排序</em>和内存系统的<em>重排序</em>。所以我们编写好Java源代码之后,会经过以上三个<em>重排序</em>,到最终的<em>指令</em>序列。我们这里提到的Java内存模型又是什么呢?Java内存模型(后面简称JMM)是语言级别的内存模
说说Java中原子性,可见性与指令重排序的理解
原子性:就是读数据,处理数据,写数据 这三个步骤不能被终止,或者打断;就是不能被线程调度器中断,切换线程。 这样,才能保证,原子操作在切成切换,并行处理上保证数据地顺序累加处理。 可见性:是Jvm较为突出的概念,其每一个线程有自己的工作内存空间,当某一个线程读取了主内存的数据,那么会通知其他线程中自己的内存空间此数据被加屏障,不可读;只能再次从主内存读数据缓存到自己的内存空间。 <em>指令</em>
原子性、内存可见性和重排序——重新认识synchronized和volatile
原子性、内存可见性和<em>重排序</em>——重新认识synchronized和volatile 一、原子性 原子性操作指相应的操作是单一不可分割的操作。例如,对int变量count执行count++d操作就不是原子性操作。因为count++实际上可以分解为3个操作:(1)读取变量count的当前值;(2)拿count的当前值和1做加法运算;(3)将加完后的值赋给count变量。 在多线程环境中
Java设计模式:单例模式+volatile禁止指令重排序
来自https://mp.weixin.qq.com/s/zn8e7nKUPXq4G4CzyE7rPA本文将会用到的关键词:单例:Singleton实例:instance同步:synchronized类装载器:ClassLoader单例模式:单例,顾名思义就是只能有一个、不能再出现第二个。就如同地球上没有两片一模一样的树叶一样。在这里就是说:一个类只能有一个实例,并且整个项目系统都能访问该实例。单...
volatile和重排序得一些小疑问
http://yeziwang.iteye.com/blog/1042492  好吧,这里我只想说说volatile在JMM中的语义。     当我们在使用volatile的时候,实际上它表达了下面那么些意思。      1. 可见性。       这个是大多数人都知道的一个特质, JAVA的线程有自己的工作内存区,与主存区不同,当我们对变量使用了volatile后,那么不管对这个...
不得不提的volatile及指令重排序(happen-before)
转:http://www.th7.cn/Program/java/201312/166504.shtml 一、不得不提的volatile volatile是个很老的关键字,几乎伴随着JDK的诞生而诞生,我们都知道这个关键字,但又不太清楚什么时候会使用它;我们在JDK及开源框架中随处可见这个关键字,但并发专家又往往建议我们远离它。比如Thread这个很基础的类,其中很重要的线程状
Java内存模型之重排序
什么是<em>重排序</em> 请先看这样一段代码1 public class PossibleReordering { static int x = 0, y = 0; static int a = 0, b = 0; public static void main(String[] args) throws InterruptedException { Thread one = new Thr
指令重排序
<em>指令</em><em>重排序</em> <em>重排序</em>的目的是提高运行并发度,发生在编译器和处理器阶段,遵循as-if-serial语义(不管怎么<em>重排序</em>,单线程程序的执行结果不能改变),也就是<em>重排序</em>所带来的<em>问题</em>是针对多线程的。 <em>重排序</em>发生的条件是A和B没有存在依赖关系,这里的依赖关系是指数据依赖关系和控制依赖关系两种。其中数据依赖表示两个以上操作访问同一个变量,且这两个操作中有一个为写操作。而控制依赖关系,比如if(a>0){i
JMM——重排序与内存屏障
<em>重排序</em> 在执行程序时为了提高性能,编译器和处理器常常会对<em>指令</em>做<em>重排序</em> <em>重排序</em>有三种类型: 1.编译器优化的<em>重排序</em> 编译器在不改变单线程程序语义的前提下,可以重新安排语句的执行顺序 2.<em>指令</em>级并行的<em>重排序</em> 现代处理器采用了<em>指令</em>级并行技术来将多条<em>指令</em>重叠执行。 如果不存在数据依赖性,处理器可以改变语句对应机器<em>指令</em>的执行顺序 3.内存系统的<em>重排序</em> 由于处理器使用缓存和读/写缓冲区,这使
volatile关键字作用与内存可见性、指令重排序概述[JAVA]
在理解volotile关键字的作用之前,先粗略解释下内存可见性与<em>指令</em><em>重排序</em>。1. 内存可见性Java内存模型规定,对于多个线程共享的变量,存储在主内存当中,每个线程都有自己独立的工作内存,并且线程只能访问自己的工作内存,不可以访问其它线程的工作内存。工作内存中保存了主内存中共享变量的副本,线程要操作这些共享变量,只能通过操作工作内存中的副本来实现,操作完毕之后再同步回到主内存当中,其JVM内存模型大
JVM的重排序问题
<em>重排序</em>通常是编译器或运行时环境为了优化程序性能而采取的对<em>指令</em>进行重新排序执行的一种手段。<em>重排序</em>分为两类:编译期<em>重排序</em>和运行期<em>重排序</em>,分别对应编译时和运行时环境。 特别是多个线程同时修改同一变量时,必须采取可靠的同步或其它措施保障数据被正确地修改,这里的一条重要原则是:不要假设<em>指令</em>执行的顺序,你无法预知不同线程之间的<em>指令</em>会以何种顺序执行。 但是在单线程程序中,通常我们容易假设<em>指令</em>是顺序执行的,否
java中的final对重排序的限制与逸出
在java中,为了保证final域的正确使用,对<em>重排序</em>进行了一些限制1.在构造函数内对一个final域的写入,与随后把这个被构造对象的引用赋值给一个引用变量,这两个操作之间不能<em>重排序</em>2.初次读一个包含final域的对象的引用,与随后初次读这个final域,这两个操作之间不能<em>重排序</em>    有了这个限制,如下A,B线程分别调用writer和reader方法时,可以保证final变量被初始化了 publ...
doublecheck单例由于指令重排产生的问题
转自https://blog.csdn.net/anjxue/article/details/51038466 在阅读之前,请先了解下线程并发涉及到的三个概念:原子性、可见性、有序性,可以看下这篇文章:http://www.cnblogs.com/dolphin0520/p/3920373.html 我假设你已经看过几篇double check的文章,但还是一知半解。 我们先看这种双重检...
Java虚拟机-指令重排序
1.什么是<em>指令</em><em>重排序</em>  编译器和处理器为了代码的执行效率会对<em>指令</em>进行重新排序,我们称之为<em>重排序</em>。 public class Demo {     private int a;     private int b;     private int c;     public void a() {         a = 1; //1         b = 2; //2         c ...
Java 指令重排序与并发
一、<em>指令</em><em>重排序</em>: 编译器或运行时环境 为了优化程序性能而采取的对<em>指令</em>进行重新排序执行的一种手段。<em>指令</em><em>重排序</em>发生在不影响语义的情况下,也就是在 单线程下,<em>重排序</em>不能导致运行结果发生变化。(即遵循as-if-serial语义)进一步解释就是在不影响执行结果的情况下,代码在jvm内的执行顺序并不是严格按照书写顺序的,出于性能方面的考虑,jvm会对它进行<em>重排序</em>。如果两个操作访问同一个变量,且这两个变量有一...
JAVA中JVM的重排序详细介绍(写得很明白)
刚刚在研究volatile变量的时候,涉及到<em>重排序</em>的概念,于是发现了这篇很好的文章,写得很简短很明白。所以转载一下。 原文地址:JAVA中JVM的<em>重排序</em>详细介绍 原文贴出来: <em>重排序</em>通常是编译器或运行时环境为了优化程序性能而采取的对<em>指令</em>进行重新排序执行的一种手段。<em>重排序</em>分为两类:编译期<em>重排序</em>和运行期<em>重排序</em>,分别对应编译时和运行时环境。 在并发程序中,程序员会特别关注不同进程或线
关于一个可见性和指令重排序的例子
java cocurrency in practicepublic class NoVisibility { private static boolean ready; private static int number; private static class ReaderThread extends Thread{ public void run(){
volatile的指令重排序理解
volatile的实现逻辑涉及的是<em>指令</em><em>重排序</em>原理,下面对该关键字不同情况下的<em>指令</em><em>重排序</em>做点简单的分析. 先上一个表格列出各种<em>重排序</em>规则. 对上面这个表格的分析如下: 1.两个操作都是普通读和写,没有volatile要求,可以<em>重排序</em> 2.如果<em>重排序</em>,操作2(volatile读主内存)排在操作1的读和写之前:   2-1. 操作2(volatile读主内存) -&amp;gt; 操作1(普通读本地内...
Java中 volatile关键字怎么禁止重排序
使用volatile关键字修饰共享变量可以禁止<em>重排序</em>。若用volatile修饰共享变量,在编译时,会在<em>指令</em>序列中插入内存屏障来禁止特定类型的处理器<em>重排序</em>   volatile禁止<em>指令</em><em>重排序</em>的一些规则:   1.当第二个操作是voaltile写时,无论第一个操作是什么,都不能进行<em>重排序</em>   2.当地一个操作是volatile读时,不管第二个操作是什么,都不能进行<em>重排序</em>   3.当第一个操作是
Java并发编程 之 指令重排序
<em>指令</em><em>重排序</em> <em>重排序</em>的目的是提高运行并发度,发生在编译器和处理器阶段,遵循as-if-serial语义(不管怎么<em>重排序</em>,单线程程序的执行结果不能改变),也就是<em>重排序</em>所带来的<em>问题</em>是针对多线程的。 <em>重排序</em>发生的条件是A和B没有存在依赖关系,这里的依赖关系是指数据依赖关系和控制依赖关系两种。其中数据依赖表示两个以上操作访问同一个变量,且这两个操作中有一个为写操作。而控制依赖关系,比如if(a>0){in
java指令重排序问题
对于instance = new Someobject(),并不是一个原子操作,这个过程分成了3步: 1,给 instance 分配内存 2,调用 Someobject的构造函数来初始化成员变量 3,
JVM学习之路(六)——指令重排序
JVM学习之路(一)——java程序执行流程 JVM学习之路(二)——JVM的内部结构 JVM学习之路(三)——JVM内部结构详细介绍及其相互作用 JVM学习之路(四)——内存模型(java多线程通信) JVM学习之路(五)——如何保证可见性 六、<em>指令</em><em>重排序</em> 根据以往学习多线程的经验,往往就会碰到这样一些例子:明明代码是按照想要的逻辑写的,但是一旦程序执行完后,就出现了一些意想不到的情...
java指令重排序问题
转载:http://my.oschina.net/004/blog/222069?fromerr=ER2mp62C <em>指令</em><em>重排序</em>是个比较复杂、觉得有些不可思议的<em>问题</em>,同样是先以例子开头(建议大家跑下例子,这是实实在在可以重现的,<em>重排序</em>的概率还是挺高的),有个感性的认识 /** * 一个简单的展示Happen-Before的例子. * 这里有两个共享变量:a和flag,初始值分别为0和fal
为啥要指令重排序
我们知道java在运行的时候有两个地方可能会把<em>指令</em><em>重排序</em>, 一个是编译器编译的的时候,一个是处理器运行的时候。 那么为啥要用<em>指令</em><em>重排序</em>呢? 编译期<em>重排序</em>有啥好处? CPU计算的时候要访问值,如果常常利用到寄存器中已有的值就不用去内存读取了,比如说 int a = 1; int b = 1; a = a + 1; b = b +1 ; 就可能没有 int a = 1; a = a ...
从单例模式挖到内存模型(二)----指令重排序
首先是一个双检锁写的单例模式的例子: public class Single{ private volatile static Single single; private Single(){} public static Single getInstance(){ if(single==null){ synchronized (Single.class) { if(si
Java的重排序影响线程调用顺序
你所认为的程序运行顺序是什么样的呢?是JVM照着程序编写的顺序运行吗?   正确答案是:不是的。
聊聊并发:(六)指令重排序与happens-before原则分析
前言 在前几章中,我们介绍了线程安全相关的关键字synchronized与volatile的使用,在介绍其原理的过程中,我们提及到了Java中的“happen-before”规则,这个规则对于我们理解Java多线程开发非常的有用,本文我们就来了解一下什么是happen-before规则。 什么是happen-before? 在上一篇我们介绍volatile实现机制的时候,在<em>指令</em><em>重排序</em>的部...
Java - 指令重排序
为什么会发生<em>指令</em><em>重排序</em>(instruction reordering) 编译器或运行时环境为了优化程序性能而采取的对<em>指令</em>进行重新排序执行的一种手段。 也就是说对于下面的语句: int a = 10; int b = 20; 在计算机执行上面两句话的时候,有可能第二条语句会先于第一条语句执行。 然而并不是所有的<em>指令</em>都能重排,重排需要基于数据依赖性。 数据依赖性 如果两个操作访问...
Java指令重排序
在执行程序时候,为了提高性能,编译器和处理器常常会对<em>指令</em>做<em>重排序</em>。<em>重排序</em>分3中类型。 1、编译器优化的<em>重排序</em>。编译器在不改变单线程程序语义的前提下,可以重新安排语句的执行顺序。 2、<em>指令</em>级并行的<em>重排序</em>。现代处理器采用了<em>指令</em>级并行技术来将多条<em>指令</em>重叠执行。如果不存在数据的依赖性,处理器可以改变语句对应机器<em>指令</em>的执行顺序。 3、内存系统的<em>重排序</em>。由于处理器使用缓存和读/写缓冲区,这使得加载和存储
一个指令重排序的例子
package test.demo2; /** * @author Dongguabai * @date 2019/1/7 13:21 */ public class SynchronizedDemo { // 共享变量 private boolean flag = false; private int a = 1; private int result = 0; //syn...
禁止指令重排序
volatile的有序性是使用内存屏障实现的,它能禁止<em>指令</em><em>重排序</em>。 在执行程序时为了提高性能,编译器和处理器通常会对<em>指令</em>做<em>重排序</em>: 编译器<em>重排序</em>。编译器在不改变单线程程序语义的前提下,可以重新安排语句的执行顺序; 处理器<em>重排序</em>。如果不存在数据依赖性,处理器可以改变语句对应机器<em>指令</em>的执行顺序; <em>指令</em><em>重排序</em>对单线程没有什么影响,他不会影响程序的运行结果,但是会影响多线程的正确性,那么我们就需要禁...
为什么要指令重排序和屏障的作用
内存屏障是一个很神奇的东西,之前翻译了linux内核文档memory-barriers.txt,对内存屏障有了一定有理解。现在用自己的方式来整理一下。 在我看来,内存屏障主要解决了两个<em>问题</em>:单处理器下的乱序<em>问题</em>和多处理器下的内存同步<em>问题</em>。 为什么会乱序 现在的CPU一般采用流水线来执行<em>指令</em>。一个<em>指令</em>的执行被分成:取指、译码、访存、执行、写回、等若干个阶段。然后,多条<em>指令</em>可以同时存在于流水
Java volatile 怎么保证不被指令重排序优化
内存间交互操作lock: 作用主内存unlock: 作用主内存read/load:这两个操作顺序执行,不能单独出现;主内存的变量=&amp;gt;工作内存的变量use: 作用工作内存,把工作内存变量传给执行引擎assign: 作用工作内存,把执行引擎收到的值赋给工作内存变量store/write: 这两个操作顺序执行;不能单独出现;工作内存的变量=&amp;gt;主内存的变量通过主内存与工作内存交互来理解这些操作...
编译器指令重排序 和 Java 内存模型
一,编译器<em>指令</em><em>重排序</em> 编译器在不影响 程序执行的结果下,可能对代码执行的先后顺序进行调整; 如: 以下代码 第二条可能会比第一条先执行; int a=1;  //&1 int b=2; //&  2 以下代码会顺序执行,不会改变顺序,因为第二条<em>指令</em>依赖第一条<em>指令</em>的结果 int a=1; int b=a+1; 看以下代码如下: public cl
流水线与指令重排序
流水线是一种<em>指令</em>级并行技术。 <em>指令</em>执行步骤 取指  IF                                (从内存中取出<em>指令</em>)                 译码和取寄存器操作数  ID    (把<em>指令</em>送到<em>指令</em>译码器进行译码,产生相应控制信号)  执行或者有效地址计算  EX    (指挥并控制CPU、内存、I/O设备的之间的数据流动) 存储器访问  MEM 写回  W...
volatile及指令重排序
一、不得不提的volatile   volatile是个很老的关键字,几乎伴随着JDK的诞生而诞生,我们都知道这个关键字,但又不太清楚什么时候会使用它;我们在JDK及开源框架中随处可见这个关键字,但并发专家又往往建议我们远离它。比如Thread这个很基础的类,其中很重要的线程状态字段,就是用volatile来修饰,见代码   /* Java thread status for tool
Java并发编程笔记——从源代码到指令序列的重排序
在执行程序时,为了提高性能,编译器和处理器常常会对<em>指令</em>做<em>重排序</em>。<em>重排序</em>分为下面三种: 1,编译器优化的<em>重排序</em>。编译器在不改变单线程程序语义的前提下,可以重新安排语句的执行顺序。 2,<em>指令</em>级并行的<em>重排序</em>。现代处理器采用了<em>指令</em>集并行技术来将多条<em>指令</em>重叠执行。如果不存在数据依赖,处理器可以改变语句对应机器<em>指令</em>的执行顺序。 3,内存系统的<em>重排序</em>。由于处理器使用缓存和读/写缓冲区,这使得加载和存储操作看上去可
Volatile 以DCL失效谈内存屏障用来禁止指令重排序的原理
引言 大家都知道volatile关键字具有两重语义即: 1)保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量的值,这新值对其他线程来说是立即可见的。 2)禁止进行<em>指令</em><em>重排序</em>。 第一个好理解,也就是说每次修改都立即更新到主内存,那么禁止<em>重排序</em>这个在网上更多的解释是说使用了内存屏障,使得前后的<em>指令</em>无法进行<em>重排序</em>。(关于volatile详解) 那么<em>问题</em>来了,什么是内存屏障?...
指令重排序优化分析和volatile对编译优化的作用
转自 http://heavensay.iteye.com/blog/1455349 <em>指令</em><em>重排序</em>       <em>指令</em><em>重排序</em>的原因:对主存的一次访问一般花费硬件的数百次时钟周期。处理器通过缓存(寄存器、cpu缓存等)能够从数量级上降低内存延迟的成本这些缓存为了性能重新排列待定内存操作的顺序。也就是说,程序的读写操作不一定会按照它要求处理器的顺序执行。 一、编译期<em>重排序</em> 编译期<em>重排序</em>的典
volatile是怎么保障内存可见性以及防止指令重排序的?
1、内存可见性 首先,要明确一下这个内存的含义,内存包括共享主存和高速缓存,Volatile关键字标识的变量,是指CPU从缓存读取数据时,要判断数据是否有效,如果缓存没有数据,则再从主存读取,主存就不存在是否有效的说法了。而内存一致性协议也是针对缓存的协议。 内存可见性意思是:一个CPU核心对数据的修改,对其他CPU核心立即可见。 这句话拆开了理解,CPU修改数据,首先是对缓存的修改,然后再...
重排序引起的内存可见性问题
什么是<em>重排序</em> 什么是内存可见性 将产生的<em>问题</em> 如何解决<em>问题</em> 什么是<em>重排序</em> <em>重排序</em>是指编译器和处理器为了优化程序性能而对<em>指令</em>序列进行重新排序的一种优化措施 如果两个操作访问同一个变量,且这两个操作有一个为写操作,此时这两个操作之间就存在数据依赖性数据依赖性可概括为以下三种类型: 上面三种情况,只要<em>重排序</em>两个操作的执行顺序,程序的结果就会被改变。在Java内存模型(以下...
voliate禁止重排序
会插入一个storestore的屏障 禁止上面的普通写 与 下面的voliate写 进行<em>重排序</em> 之后再会插入一个 soreLoad的屏障 禁止上面的 voliate写与下面有可以有的voliate读写进行<em>重排序</em>...
JVM系列 : 字节码、指令重排序
字节码简介 1.计算机只能识别0 1 , 经过0 1的组合 , 产生了数字 , 0 1组合也产生了各种字符 , 各种机器<em>指令</em> 2.不同的时代 , 不同产商 , 机器<em>指令</em>集(arm , x86 , rsic ...)是不同的 3.CPU与<em>指令</em>集直接耦合 , 一个程序要在多个平台运行 , 需要多套代码 4.如何实现跨平台 , 中间码(字节码)应运而生 字节码实际应用 1.字节码是JVM里指...
“双重检验锁失效”的问题说明
双重检验锁是一个高效的懒加载方法,被广泛引用或应用于多线程环境中。但是,在Java中,如果没有额外的同步,它并不能以独立的方式可靠地工作。当在其它语言上时,比如C++,它依赖于处理器的内存模型,编译器<em>重排序</em>以及编译器和同步库的交互。由于C++并没有对以上内容作出具体说明,所以很难说明在什么情况下双重检验锁会正常运行。在C++中可以显式地使用内存屏障
原子操作,内存可见性与指令重排序
&quot;原子操作(atomic operation)是不需要synchronized&quot;,这是Java多线程编程的老生常谈了。所谓原子操作是指不会被线程调度机制打断的操作;这种操作一旦开始,就一直运行到结束,中间不会有任何 context switch (切 换到另一个   原子操作       原子操作(atomic operation),是指不会被线程调度机制打断的操作;这种操作一旦开始,就一直...
解决安装LoadRunner问题
LoadRunner安装过程中,提示:少了Microsoft Visual c++2005 sp1运行时组件,安装时会提示命令行选项语法错误,键入“命令/?”可获取帮肋信息,无法正常安装;
java从源代码到指令序列的重排序
啊大苏打
深入分析Synchronized原理
深入分析Synchronized原理 Java高级架构师 2018-08-16 17:16:45 0 前言 记得开始学习Java的时候,一遇到多线程情况就使用synchronized,相对于当时的我们来说synchronized是这么的神奇而又强大,那个时候我们赋予它一个名字“同步”,也成为了我们解决多线程情况的百试不爽的良药。但是,随着学习的进行我们知道在JDK1.5之前synchroni...
Java基础: 什么是指令重排序/as-if-serial/内存屏障/happens-before
Java基础知识<em>指令</em><em>重排序</em>在执行程序时,为了提高性能,编译器和处理器会对<em>指令</em>做<em>重排序</em>。编译器优化<em>重排序</em>:编译器在不改变单线程程序语义的前提下,可以重新安排语句的执行顺序。<em>指令</em>级并行的<em>重排序</em>:如果不存l在数据依赖性,处理器可以改变语句对应机器<em>指令</em>的执行顺序。内存系统的<em>重排序</em>:处理器使用缓存和读写缓冲区,这使得加载和存储操作看上去可能是在乱序执行。但是,可以通过插入特定类型的Memory Barrie...
处理器重排序与内存屏障
处理器<em>重排序</em>: 现代处理器使用写缓冲区来临时保存向内存写数据。 内存屏障<em>指令</em> 为了保证内存可见性,java编译器在生成编译器<em>指令</em>时,会假如内存屏障<em>指令</em>来禁止特定的处理器<em>重排序</em>
JVM指令重排导致Singleton双重锁定出错
<em>指令</em>重排导致单例模式失效 我们都知道一个经典的懒加载方式的单例模式: public class Singleton { private static Singleton instance = null; private Singleton() { } public static Singleton getInstance() { if(instance == n
Java内存模型中的重排序
<em>重排序</em>是指编译器和处理器为了优化程序性能而对<em>指令</em>序列进行重新排序的一种手段。 但是不能随时随地的<em>重排序</em>,我们可以看一个例子看待这个<em>问题</em>。 上面三种情况,只要<em>重排序</em>两个操作的执行顺序,那么程序的结果就会被改变。 所以 <em>重排序</em>需要遵守一些规则。 a、编译器和处理器不会改变存在数据依赖性关系的两个操作的执行顺序 b、单线程下,不能改变数据的执行结果 一、数据依赖性 在上面的情况中,我们...
03.(多线程与并发)面试题-02--Volidate的原理和指令重排序
线程栈(线程的工作内存)保存了线程运行时候变量值信息。当线程访问某一个对象时候值的时候,首先通过对象的引用找到对应在堆内存的变量的值,然后把堆内存变量的具体值load到线程本地内存中,建立一个变量副本,之后线程就不再和对象在堆内存变量值有任何关系,而是直接修改副本变量的值,   在修改完之后的某一个时刻(线程退出之前),自动把线程变量本的值回写到对象在堆中变量。这样在堆中的对象的值就产生变化
精通J2EE--Eclipse、Struts、Hibernate及Spring整合应用案例 随书源码1下载
<精通J2EE--Eclipse、Struts、Hibernate及Spring整合应用案例>源码和数据库。这是第2卷,请下载完7卷后解压。 相关下载链接:[url=//download.csdn.net/download/wengnet/217158?utm_source=bbsseo]//download.csdn.net/download/wengnet/217158?utm_source=bbsseo[/url]
OFDM系统MATLAB仿真代码下载
OFDM系统MATLAB仿真代码 现代数字调制解调技术的一种高效调制技术OFDM正交频分复用,他是一种多载波传输技术,N个子载波把整个信道分割成N个子信道,N个子信道并行传输信息。 OFDM系统是一种特殊的多载波传输技术,其特点是各子载波相互正交,扩频调制后的频谱可相互重叠,不但减少了子载波间的相互干扰,还大大提高了频谱利用率,OFDM的主要技术特点如下: (1)可有效对抗信号波形间的干扰,适用于多径环境和衰落信道中的高速数据传输; (2)通过各子载波的联合编码,具有很强的抗衰落能力; (3)各子信道的正交调制和解调可通过离散傅利叶反变换IDFT和离散傅利叶变换DFT实现; (4)OF 相关下载链接:[url=//download.csdn.net/download/EYunSia/2902048?utm_source=bbsseo]//download.csdn.net/download/EYunSia/2902048?utm_source=bbsseo[/url]
新编ASP.NET从入门到精通(1DVD)(双色印刷)源码下载
【作者】 龙马工作室 【编辑】 魏雪萍 本书围绕ASP.NET 2.0技术以及使用这项技术进行项目开发展开深入讲解。全书共分为5篇,第1篇为入门篇,主要介绍ASP.NET入门、C#语言入门和ASP.NET网站开发入门;第2篇为开发篇,主要介绍ASP.NET Web常用控件、网页样式与布局设计——CSS+DIV、网页美化技术、网站的上传、打包与安装;第3篇为数据库应用篇,主要介绍数据库管理系统SQL Server 2005、SQL语言速成、数据库网站实例、使用网站后台数据库、常用数据库控件详解、常用信息处理技术及数据库连接管理;第4篇为精通篇,主要介绍ASP.NET 网站常用模块设计、 相关下载链接:[url=//download.csdn.net/download/archimedes1985/2159923?utm_source=bbsseo]//download.csdn.net/download/archimedes1985/2159923?utm_source=bbsseo[/url]
文章热词 设计制作学习 机器学习教程 Objective-C培训 交互设计视频教程 颜色模型
相关热词 mysql关联查询两次本表 native底部 react extjs glyph 图标 大数据大神班 java大神班
我们是很有底线的