1.什么是指令重排
程序指令的执行顺序有可能和代码的顺序不一致,这个过程就称之为指令重排。
2.指令重排的作用
JVM能根据处理器的特性,充分利用多级缓存,多核等进行适当的指令重排序,使程序在保证业务运行的同时,充分利用CPU的资源,发挥最大的性能!
由于指令重排的特性,为了保证程序在多线程的条件下运行结果能够与单一线程下一致,引入了Happens-Before规则。也就是说,Happens-Before规则主要是用来确保并发情况下数据的正确性。
3.Happens-Before的含义
如果动作B要看到动作A的执行结果,无论A/B是否在同一个线程中,那么A/B必须满足happens-before规则。
4. happens-before规则
1)如果ActionA和ActionB属于同一个线程,那么就说明ActionA happens-before ActionB。
2)如果ActionA是unlock操作,而ActionB是lock操作,那么ActionA happens-before ActionB。
3)如果A是对volatile变量的写操作,ActionB是对同一个变量的读操作,那么ActionA happens-before ActionB。
4)线程的启动Action happens-before 该线程上的其他动作。
5)线程中任何Action都 happens-before 任何其他线程检测到该线程已经结束、Thread.join调用成功返回,Thread.isAlive返回false。
6)一个线程调用另一个线程的interrupt一定发生在另一个线程中断之前。
7)一个对象的构造函数结束一定发生在兑现finalizer之前。
8)ActionA发生在ActionB之前,ActionB发生在ActionC之前,则ActionA一定发生在ActionC之前。
ActionA happends-before ActionB,记作hb(ActionA,ActionB)。
5. JMMA(Java Memory Model Action)
Java模型动作,一个Action包含,变量读取、变量写、监视器枷锁、释放锁、线程启动(start)、线程等待(join)。
6. happens-before应用的例子
作者:clarityblack
链接:https://www.jianshu.com/p/f361345d06f6
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
相关推荐
2、防止指令重排 此外需注意volatile并不保证操作的原子性。 (一)内存可见性 1 概念 JVM内存模型:主内存和线程独立的工作内存 Java内存模型规定,对于多个线程共享的变量,存储在主内存当中,...
volatile指令重排
此外,该研究还结合虚拟机保护技术,构建了一个名为IS-VMP(基于指令重排的虚拟机保护系统)的原型系统。IS-VMP将指令乱序方法应用于虚拟机代码,进一步增强了混淆效果。通过使用加密算法实例进行系统测试,作者们...
- **指令重排**:适当调整指令的执行顺序,确保不会同时有两个指令竞争同一资源。 ##### 4. 实验操作 在实验中,首先用DLX汇编语言编写包含数据相关性和结构相关性的代码。然后利用WinDLX模拟器进行实验。具体步骤...
指令同步屏障(ISB)是针对指令流的屏障,它强制所有未完成的指令重排或取消。ISB用于确保指令的顺序,防止因乱序执行而导致的问题。如果修改了指令的执行顺序或者有分支预测失败,使用ISB可以确保处理器重新同步其...
这一判断有助于实现更高效的指令重排或合并。 3. **判断effect_level是否相同**:`effect_level`是指节点对程序状态的影响程度。在指令选择过程中,如果两个节点的`effect_level`相同,则意味着它们对程序状态的...
- 在单线程环境下,指令重排不会改变程序的最终结果,但在多线程环境下可能会导致问题。 - 编译器和处理器为了提高效率,可能会对指令进行重排序,但必须遵循数据依赖性和Happens-Before规则。 - 指令重排在多...
2. **禁止指令重排**:指令重排是编译器和处理器为了提高性能而进行的一种优化策略。然而,`volatile`关键字能防止特定类型的指令重排,确保在多线程环境下,对`volatile`变量的读写操作遵循一定的顺序。具体来说,...
3. **禁止指令重排**:volatile关键字通过内存屏障来防止指令重排。在写操作后插入一个写屏障,确保写操作不会被移到前面;在读操作前插入一个读屏障,确保读操作不会被移到后面。这样保证了其他线程看到的volatile...
volatile作为轻量级的同步机制,具有保证可见性、不保证原子性和禁止指令重排等特性。JMM则定义了程序中各个变量的访问规则,确保多线程环境下的正确通信。 【正文】: Java并发编程是系统设计中必不可少的一部分...
2. **禁止指令重排**:`volatile`可以阻止编译器和处理器为了优化性能而进行的指令重排序,这在多线程环境中特别关键,因为指令重排可能会导致程序的行为与预期不符。 3. **读取和写入的原子性**:对于基本类型,如...
JUC是什么 线程 进程 / 线程 线程状态 wait / sleep 并发 / 并行 Lock 使用Lock锁 可重入锁 公平锁 / 非公平锁 Synchronized / Lock 线程通讯 wait()、notify()和notifyAll() 虚假唤醒 ...指令重排 JMM
- **volatile用法**:volatile关键字确保变量的可见性和禁止指令重排。 - **动态权限适配方案**:Android 6.0之后,应用必须在运行时请求危险权限。 - **网络请求缓存处理**:通过设置缓存策略和缓存有效期,优化...
### 滤波锐化技术在级联积分组合抽取滤波器中的应用 #### 引言 在通信和信号处理系统中,从很宽的频带信号中隔离出一个非常窄的频带信号的需求十分常见。例如,在宽带卫星通信链路中,可能会有多个不同的信号被...
内存顺序问题主要由指令重排引起,它可能导致原本的内存可见顺序发生变化。在多线程环境下,如果不正确处理,可能会引发数据竞争和不确定性。 在C++11中,通过内存顺序标记(如seq_cst、acq_rel等)可以指定操作的...
- **禁止指令重排**:`volatile`变量的读写操作会插入内存屏障,防止编译器或处理器对其进行重排序。 - **不保证原子性**:虽然`volatile`可以提供可见性,但它不能保证复合操作的原子性。 **示例**:使用`volatile...
4. 流水线和执行优化:A64指令集在设计时考虑到了现代处理器的流水线和执行引擎的特性,能够更好地支持并行处理和指令重排,提升指令吞吐量。 5. 增强的异常和中断处理能力:A64状态包含改进的异常和中断处理机制,...
- NOP位移法不是万能的,对于某些复杂情况,可能需要结合其他逆向工程技巧,如指令重排、指令替换等。 - 修改二进制代码可能导致程序崩溃或安全风险,仅在合法和安全的环境下进行此类操作。 总的来说,NOP位移法是...
由于现代计算机系统的CPU处理速度远超过内存访问速度,为了提高性能,CPU会采用缓存(Cache)技术,而这种技术往往会导致内存操作的重新排序,也就是所谓的指令重排。内存屏障的主要作用就是用来避免这种指令重排...