多线程执行会导致指令重排序,那为什么还能在程序中打断点

在指令重排序中,多线程的执行可能不是按照我们书写代码的顺序在执行,那如果这样,为什么我还可以打上断点呢,打了断点不就意味着他是按照我书写程序的顺序在进行吗?
比如,a=1;b=2;c=a+b;那么根据指令重排序的原则,程序可能先读取b=2,也有坑你先读取a=1,那我打断点不就意味着肯定先读取a=1再读取b=2吗

0

2个回答

debug调试模式,很多优化会禁用,所以就不会指令重排等

1
wwg2413980145
W2G 原来如此,找到这块的资料了
一年多之前 回复

并发错误很多用debug根本就调不出来,重排序是因为竟态竞争导致的

0
wwg2413980145
W2G 是的~
一年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
关于一个可见性和指令重排序的例子
java cocurrency in practicepublic class NoVisibility { private static boolean ready; private static int number; private static class ReaderThread extends Thread{ public void run(){
JAVA并发理解之重排序问题
       首先我们先来了解一下什么是重排序:重排序是指编译器和处理器为了优化程序性能而对指令序列进行重新排序的一种手段。从Java源代码到最终实际执行的指令序列,会分别经历下面3种重排序,如下图所示      上述的1属于编译器重排序,2和3属于处理器重排序。这些重排序可能会导致多线程程序出现内存可见性问题。在单线程程序中,对存在控制依赖的操作重排序,不会改变执行结果(这也是as-if-ser...
Java重排序对多线程的影响
上一次的发文远在两个月前了,算是经历了一段低糜期,本来打算的更新一直断更到现在。还是好好学习吧,努力的人运气一定不会差的。这一篇文章来谈一谈Java虚拟机对代码优化带来的影响吧。我们知道无论什么语言,最后驱动计算机的那一定是汇编,Java代码编译后会变成一段字节码,通过Java虚拟机的类加载机制ClassLoader加载到虚拟机里面,最后便是把它转化成汇编指令。通过JMM(Java内存模型)实现内存
多线程之指令重排序
1、首先为何要指令重排序(instruction reordering)? 编译器或运行时环境为了优化程序性能而采取的对指令进行重新排序执行的一种手段。 也就是说,对于下面两条语句: int a = 10; int b = 20; 在计算机执行上面两句话的时候,有可能第二条语句会先于第一条语句执行。所以,千万不要随意假设指令执行的顺序。 2、是不是所有的语句的执行顺
Java的重排序影响线程调用顺序
你所认为的程序运行顺序是什么样的呢?是JVM照着程序编写的顺序运行吗?   正确答案是:不是的。
如何断点调试多线程? .
下面是我的代码:         private   void   menuItem2_Click(object   sender,   System.EventArgs   e)     {     Thread   thread=new   Thread(new   ThreadStart(this.foo));     thread.Start();     //在这一行
Java多线程--重排序与顺序一致性
前言 在我们编写程序并运行的时候,编译器给我们一个错觉:程序编译的顺序与编写的顺序是一致的。但是实际上,为了提高性能,编译器和处理器常常会对指令进行重排序。重排序主要分为两类:编译器优化的重排序、指令级别并行的重排序和内存系统的重排序。所以我们编写好Java源代码之后,会经过以上三个重排序,到最终的指令序列。我们这里提到的Java内存模型又是什么呢?Java内存模型(后面简称JMM)是语言级
说说Java中原子性,可见性与指令重排序的理解
原子性:就是读数据,处理数据,写数据 这三个步骤不能被终止,或者打断;就是不能被线程调度器中断,切换线程。 这样,才能保证,原子操作在切成切换,并行处理上保证数据地顺序累加处理。 可见性:是Jvm较为突出的概念,其每一个线程有自己的工作内存空间,当某一个线程读取了主内存的数据,那么会通知其他线程中自己的内存空间此数据被加屏障,不可读;只能再次从主内存读数据缓存到自己的内存空间。 指令
多线程之重排序详解
重排序 重排序是指编译器和处理器为了优化程序性能而对指令序列进行重新排序的一种手段。 数据依赖性 如果两个操作访问同一个变量,且这两个操作中有一个为写操作,此时这两个操作之间就存在数据的依赖性。数据依赖分为3中类型,如下表所示: 上面3中情况,只要重排序两个操作的顺序。程序的结果就会改变。编译器和处理器是可以对操作进行重排序的,在重排序时,会遵守数据依赖性,编译器和处理器不会改变存在数...
为什么程序并发执行会产生间断性特征?
程序在并发执行时,由于它们共享系统资源,以及为完成同一项任务而相互合作,致使在这些并发执行的进程之间,形成了相互制约的关系,从而也就使得进程在执行期间出现间断性。
由Java引起的指令重排序思考
背景 问题出现 在6360灰度期间从Crash平台上看到了一个NullPointerException,虽然量不大,但是很怪异,大致长这个样子 这是个什么空指针?居然说我LinkedList.iterator().hasNext()方法有问题?可是我就是正常的调用hasNext()啊,怎么就抛出来这种异常了呢? 问题初分析 调用LinkedList.iterator().h
Java并发编程系列之三:重排序与顺序一致性
前言在我们编写程序并运行的时候,编译器给我们一个错觉:程序编译的顺序与编写的顺序是一致的。但是实际上,为了提高性能,编译器和处理器常常会对指令进行重排序。重排序主要分为两类:编译器优化的重排序、指令级别并行的重排序和内存系统的重排序。所以我们编写好Java源代码之后,会经过以上三个重排序,到最终的指令序列。我们这里提到的Java内存模型又是什么呢?Java内存模型(后面简称JMM)是语言级别的内存模
java synchronized具有禁止重排序功能
1.结论我们知道volatile关键字具有禁止指令重排序的功能,而且能保证可见性,但不能保证原子性。synchronized关键字则不仅仅能保证可见性,还能保证原子性,那么synchronized关键字是否像volatile那样具有禁止指令重排序的功能呢?答案是肯定的,synchronized具有禁止重排序功能。2.论据出处查找国内文档,发现基本对synchronized的描述很少提及禁止重排序的问
什么是重排序问题
十七、 什么是重排序问题Java内存模型中,允许编译器和处理器对指令进行重排序,但是重排序可以保证最终执行的结果是与程序顺序执行的结果一致,并且只会对不存在数据依赖性的指令进行重排序,这个重排序在单线程下对最终执行结果是没有影响的,但是在多线程下就会存在问题。一个例子int a = 1;(1) int b = 2;(2) int c= a + b;(3) 如上c的值依赖a和b的值,所以重排序后能够
java中的final对重排序的限制与逸出
在java中,为了保证final域的正确使用,对重排序进行了一些限制1.在构造函数内对一个final域的写入,与随后把这个被构造对象的引用赋值给一个引用变量,这两个操作之间不能重排序2.初次读一个包含final域的对象的引用,与随后初次读这个final域,这两个操作之间不能重排序    有了这个限制,如下A,B线程分别调用writer和reader方法时,可以保证final变量被初始化了 publ...
03.(多线程与并发)面试题-02--Volidate的原理和指令重排序
线程栈(线程的工作内存)保存了线程运行时候变量值信息。当线程访问某一个对象时候值的时候,首先通过对象的引用找到对应在堆内存的变量的值,然后把堆内存变量的具体值load到线程本地内存中,建立一个变量副本,之后线程就不再和对象在堆内存变量值有任何关系,而是直接修改副本变量的值,   在修改完之后的某一个时刻(线程退出之前),自动把线程变量本的值回写到对象在堆中变量。这样在堆中的对象的值就产生变化
doublecheck单例由于指令重排产生的问题
转自https://blog.csdn.net/anjxue/article/details/51038466 在阅读之前,请先了解下线程并发涉及到的三个概念:原子性、可见性、有序性,可以看下这篇文章:http://www.cnblogs.com/dolphin0520/p/3920373.html 我假设你已经看过几篇double check的文章,但还是一知半解。 我们先看这种双重检...
volatile是怎么保障内存可见性以及防止指令重排序的?
1、内存可见性 首先,要明确一下这个内存的含义,内存包括共享主存和高速缓存,Volatile关键字标识的变量,是指CPU从缓存读取数据时,要判断数据是否有效,如果缓存没有数据,则再从主存读取,主存就不存在是否有效的说法了。而内存一致性协议也是针对缓存的协议。 内存可见性意思是:一个CPU核心对数据的修改,对其他CPU核心立即可见。 这句话拆开了理解,CPU修改数据,首先是对缓存的修改,然后再...
编译器指令重排序 和 Java 内存模型
一,编译器指令重排序 编译器在不影响 程序执行的结果下,可能对代码执行的先后顺序进行调整; 如: 以下代码 第二条可能会比第一条先执行; int a=1;  //&1 int b=2; //&  2 以下代码会顺序执行,不会改变顺序,因为第二条指令依赖第一条指令的结果 int a=1; int b=a+1; 看以下代码如下: public cl
debug断点不执行/进断点后 不显示走到哪一行的问题
在eclipse中遇到了debug断点不执行,以及强行打方法头 进断点后 不显示走到哪一行的问题
Java中 volatile关键字怎么禁止重排序
使用volatile关键字修饰共享变量可以禁止重排序。若用volatile修饰共享变量,在编译时,会在指令序列中插入内存屏障来禁止特定类型的处理器重排序   volatile禁止指令重排序的一些规则:   1.当第二个操作是voaltile写时,无论第一个操作是什么,都不能进行重排序   2.当地一个操作是volatile读时,不管第二个操作是什么,都不能进行重排序   3.当第一个操作是
volatile关键字作用与内存可见性、指令重排序概述[JAVA]
在理解volotile关键字的作用之前,先粗略解释下内存可见性与指令重排序。1. 内存可见性Java内存模型规定,对于多个线程共享的变量,存储在主内存当中,每个线程都有自己独立的工作内存,并且线程只能访问自己的工作内存,不可以访问其它线程的工作内存。工作内存中保存了主内存中共享变量的副本,线程要操作这些共享变量,只能通过操作工作内存中的副本来实现,操作完毕之后再同步回到主内存当中,其JVM内存模型大
volatile和重排序得一些小疑问
http://yeziwang.iteye.com/blog/1042492  好吧,这里我只想说说volatile在JMM中的语义。     当我们在使用volatile的时候,实际上它表达了下面那么些意思。      1. 可见性。       这个是大多数人都知道的一个特质, JAVA的线程有自己的工作内存区,与主存区不同,当我们对变量使用了volatile后,那么不管对这个...
重排序引起的内存可见性问题
什么是重排序 什么是内存可见性 将产生的问题 如何解决问题 什么是重排序 重排序是指编译器和处理器为了优化程序性能而对指令序列进行重新排序的一种优化措施 如果两个操作访问同一个变量,且这两个操作有一个为写操作,此时这两个操作之间就存在数据依赖性数据依赖性可概括为以下三种类型: 上面三种情况,只要重排序两个操作的执行顺序,程序的结果就会被改变。在Java内存模型(以下...
eclipse,自己没有设置断点,也会在debug时断点
在跑eclipse,自己没有设置断点,也会在debug时断点。后来发现是因为另一个project的同名文件设了断点,去掉就好了.
为什么要指令重排序和屏障的作用
内存屏障是一个很神奇的东西,之前翻译了linux内核文档memory-barriers.txt,对内存屏障有了一定有理解。现在用自己的方式来整理一下。 在我看来,内存屏障主要解决了两个问题:单处理器下的乱序问题和多处理器下的内存同步问题。 为什么会乱序 现在的CPU一般采用流水线来执行指令。一个指令的执行被分成:取指、译码、访存、执行、写回、等若干个阶段。然后,多条指令可以同时存在于流水
JAVA中JVM的重排序详细介绍(写得很明白)
刚刚在研究volatile变量的时候,涉及到重排序的概念,于是发现了这篇很好的文章,写得很简短很明白。所以转载一下。 原文地址:JAVA中JVM的重排序详细介绍 原文贴出来: 重排序通常是编译器或运行时环境为了优化程序性能而采取的对指令进行重新排序执行的一种手段。重排序分为两类:编译期重排序和运行期重排序,分别对应编译时和运行时环境。 在并发程序中,程序员会特别关注不同进程或线
idea多线程调试 以及 java线程无法中断!原因竟然是.....
微信谣言体标题23333333 新手垃圾问题预警!大神请绕道!不要鄙视我! 说来惭愧这个问题找了挺久,作为一个并发编程渣渣,甚至都不知道怎么用idea进行多线程调试,这次虽然找问题找了半天,但也算有点收获 场景是我要开一个线程去定期用各种参数请求一个接口,来缓存这个接口的结果,用于兜底服务,并且服务本身提供了一个接口用于停止线程并重新创建一个线程从头来。 我的做法是搞了一个单线程池,下面分别是停止...
eclipse debug 执行到断点处并没有停下,断点无效问题
现象: 利用eclipse debug时,并没有在设置断点的那一行代码停下 原因: JVM上实际运行的代码和设置断点的代码不是同一份。我安装过jadeclipse插件, 它会把.class文件反编译为.java文件,但是反编译的结果文件跟真正的source代码有可能不一致。  排查:  1. eclipse打开的是反编译生成的文件,并非源代码 2.  本地maven仓库没有so
解决不加断点就执行失败的问题
1.先解释一下这种情况产生的原因: 这是由于线程异步的问题,一般出现在本应该顺序执行两个任务, 比如A,B两个任务,正常情况下应该A先执行完成之后,B才能开始执行,但是B执行时,A还未完全执行结束,这种情况下就会导致本应该同步执行的事情变为异步 执行,此时就会出现问题,但是为什么加上断点之后就得到预期结果呢, 比如给B加上断点,这是因为给任务B加上断点,就会导致B这个任务的线程变慢,从而给任务A...
Java并发编程 之 指令重排序
指令重排序 重排序的目的是提高运行并发度,发生在编译器和处理器阶段,遵循as-if-serial语义(不管怎么重排序,单线程程序的执行结果不能改变),也就是重排序所带来的问题是针对多线程的。 重排序发生的条件是A和B没有存在依赖关系,这里的依赖关系是指数据依赖关系和控制依赖关系两种。其中数据依赖表示两个以上操作访问同一个变量,且这两个操作中有一个为写操作。而控制依赖关系,比如if(a>0){in
JVM的重排序问题
重排序通常是编译器或运行时环境为了优化程序性能而采取的对指令进行重新排序执行的一种手段。重排序分为两类:编译期重排序和运行期重排序,分别对应编译时和运行时环境。 特别是多个线程同时修改同一变量时,必须采取可靠的同步或其它措施保障数据被正确地修改,这里的一条重要原则是:不要假设指令执行的顺序,你无法预知不同线程之间的指令会以何种顺序执行。 但是在单线程程序中,通常我们容易假设指令是顺序执行的,否
java调试打断点和不打断点执行结果不一致问题解决
  java程序在调试的时候需要debug来跟踪一下结果,有一种情况是这样的,正常执行java程序就会出现问题,而断点debug跟踪此方法的时候却是正常的,不断测试结果都是这样,由此判断有可能是因为此方法在执行的时候所需要的参数在获取的时候需要一段时间,而debug的时候是一步一步执行代码,时间很充足,而当程序正常执行的时候由于执行的时间很快,某一个或一些参数没有获取到就直接执行了此方法,由此导致...
有关Debug和断点的总结
有关Debug和断点的总结
为啥要指令重排序?
我们知道java在运行的时候有两个地方可能会把指令重排序, 一个是编译器编译的的时候,一个是处理器运行的时候。 那么为啥要用指令重排序呢? 编译期重排序有啥好处? CPU计算的时候要访问值,如果常常利用到寄存器中已有的值就不用去内存读取了,比如说 int a = 1; int b = 1; a = a + 1; b = b +1 ; 就可能没有 int a = 1; a = a ...
原子操作,内存可见性与指令重排序
"原子操作(atomic operation)是不需要synchronized",这是Java多线程编程的老生常谈了。所谓原子操作是指不会被线程调度机制打断的操作;这种操作一旦开始,就一直运行到结束,中间不会有任何 context switch (切 换到另一个   原子操作       原子操作(atomic operation),是指不会被线程调度机制打断的操作;这种操作一旦开始,就一直...
Java虚拟机-指令重排序
1.什么是指令重排序  编译器和处理器为了代码的执行效率会对指令进行重新排序,我们称之为重排序。 public class Demo {     private int a;     private int b;     private int c;     public void a() {         a = 1; //1         b = 2; //2         c ...
Volatile 以DCL失效谈内存屏障用来禁止指令重排序的原理
引言 大家都知道volatile关键字具有两重语义即: 1)保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量的值,这新值对其他线程来说是立即可见的。 2)禁止进行指令重排序。 第一个好理解,也就是说每次修改都立即更新到主内存,那么禁止重排序这个在网上更多的解释是说使用了内存屏障,使得前后的指令无法进行重排序。(关于volatile详解) 那么问题来了,什么是内存屏障?...
Idea Debug多线程不进断点问题处理
idea debug打得断点第一次可以进入,第二次不能进入 Idea也会使我狼狈不堪,Eclipse下约定成俗,却非Idea的默认规则。 比如 DEBUG多个线程时,Idea的默认设定就会遇到断点不能进入的问题。 解决的方法: 点击DEBUF框下的双红点(View Breakpoints) 右侧 Disabled until selected breakpoint i
Java设计模式:单例模式+volatile禁止指令重排序
来自https://mp.weixin.qq.com/s/zn8e7nKUPXq4G4CzyE7rPA本文将会用到的关键词:单例:Singleton实例:instance同步:synchronized类装载器:ClassLoader单例模式:单例,顾名思义就是只能有一个、不能再出现第二个。就如同地球上没有两片一模一样的树叶一样。在这里就是说:一个类只能有一个实例,并且整个项目系统都能访问该实例。单...
文章热词 设计制作学习 机器学习教程 Objective-C培训 交互设计视频教程 颜色模型
相关热词 mysql关联查询两次本表 native底部 react extjs glyph 图标 那学python python那学