HSDIS有什么用?用来看汇编,有用么? 答案是有用的。
举个最简单的例子,volatile,是java关键字,那在汇编层面是如何做的呢?
示例代码:
import java.util.*;
public class VolatileTest {
public volatile long value = 0;
public static void main(String[] args) {
VolatileTest t = new VolatileTest();
t.value = 3;
System.out.println("value is: " + t.value);
}
}
编译
root@ubuntu:~/Downloads# javac VolatileTest.java
运行
root@ubuntu:~/Downloads# java -Xcomp -server -XX:+UnlockDiagnosticVMOptions -XX:+PrintAssembly -XX:+DebugNonSafepoints VolatileTest > disass.log
查看disass.log,寻找相关的汇编代码:
0x00007f8f9446d688: lock addl $0x0,(%rsp) ;*putfield value
; - VolatileTest::<init>@6 (line 4)
结合putfield value 和 bytecode, 可以知道这条指令就是 对value的赋值操作。
看见了什么?
lock
补充:
关于lock,可以参考64-ia-32-architectures-software-developer-manual
截取2段:
Intel 64 and IA-32 processors provide a LOCK# signal that is asserted automatically during certain critical memory operations to lock the system bus or equivalent link. While this output signal is asserted, requests from other processors or bus agents for control of the bus are blocked.
To explicitly force the LOCK semantics, software can use the LOCK prefix with the following instructions when they are used to modify a memory location.
分享到:
相关推荐
在C语言中,`volatile`是一个类型限定符,用于告知编译器不要对该变量进行优化,因为它可能在任何时候被未知的外部源更改。当一个变量被声明为`volatile`时,编译器会假设它的值可能在任意时间发生变化,因此每次...
《深入理解Volatile》 Volatile是C/C++编程语言中的一个关键字,它与const一起被称为"cv特性",用于指示变量的值可能被系统或其他线程/进程改变,从而强制编译器每次从内存中读取该变量的最新值。在多线程或嵌入式...
volatile是一种特殊的变量修饰符,它告诉编译器,这个变量的值可能会被意外地改变,因此编译器不能对其进行优化,以确保每次读取该变量时都能获取最新的值。下面是volatile变量的使用场景: 1. 并行设备的硬件...
在这个例子中,我们定义了一个 volatile 的整数变量 i,然后对其进行赋值操作,但是编译器并没有对其进行优化,而是按照我们编写的代码来执行。在第二个例子中,我们可以看到,如果不使用 volatile 关键字,编译器...
正确使用 volatile 变量的条件是:对变量的写操作不依赖于当前值,以及该变量没有包含在具有其他变量的不变式中。在实际应用中,这些条件表明,可以被写入 volatile 变量的这些有效值独立于任何程序的状态,包括变量...
重排序是指编译器和处理器为了优化性能而可能对指令序列进行重新排列的一种行为。在Java中,volatile关键字能够防止指令重排序,确保多线程环境下的正确性。让我们通过一个例子来理解这一点: ```java public class...
Volatile是C语言中的一个类型修饰符,用于告诉编译器该变量可能会在程序的控制之外被改变,从而禁止编译器对涉及该变量的代码做优化处理。这种用法在多线程、中断服务程序和硬件访问等场合特别重要。接下来详细说明...
4. 避免编译器优化:`volatile`告诉编译器不要对这类变量进行优化,每次访问都从内存中读取,确保获取最新值。 5. `volatile`与`const`结合:`volatile const`变量表示其值可以被外部因素改变,但程序内部不应尝试...
2. **禁止指令重排序**:编译器通常会对指令进行重排序以优化性能,但volatile变量的写操作后,后续读操作不能被提前,写操作前的读操作也不能被延后。这确保了对volatile变量的修改按照程序的顺序进行,防止出现...
它的主要作用是确保对变量的修改能够立即反映到所有线程,防止编译器进行不必要的优化,使得其他线程能够及时获取到最新值。 1. `volatile`的基本用法: 当一个变量被声明为`volatile`时,编译器会知道这个变量的...
这样做是为了防止编译器对这些变量进行优化而导致数据不一致。 3. **多线程应用中被几个任务共享的变量** 在多线程或多任务环境中,多个线程或任务可能会同时访问同一块内存区域。如果没有正确的同步机制,这种...
单片机中volatile定义的作用是指在单片机编程中,使用volatile关键字来定义变量,使编译器认为该变量可能会被意外地改变,从而避免编译器对该变量的优化。这样,编译器将每次都重新读取该变量的值,而不是使用保存在...
### volatile详解 #### 一、volatile的基本概念与作用 `volatile`关键字在编程语言中扮演着重要的角色,尤其是在处理并发编程、嵌入式系统开发等领域。`volatile`的中文含义通常被翻译为“易变的”,但根据描述中...
`volatile`关键字主要用于指示编译器不要对声明为`volatile`的变量进行优化。这是因为这类变量的值可能会在程序运行过程中被外部因素(如硬件中断或其他线程)意外地改变。 **使用场景**: 1. **并行设备的硬件...
java volatile 关键字实战java volatile 关键字实战java volatile 关键字实战java volatile 关键字实战java volatile 关键字实战java volatile 关键字实战java volatile 关键字实战java volatile 关键字实战java ...
- **作用**:使用 `volatile` 关键字声明的变量,编译器在处理对该变量的访问时,不会对其进行优化,确保每次访问都是最新的值。这对于保证线程安全、硬件访问等方面非常重要。 #### 二、Volatile 的工作原理 - **...
在C语言标准中,“volatile”是一个类型修饰符,它告诉编译器对使用该类型变量的操作不应进行优化。这种变量通常是用来表示那些可能在程序外部(比如硬件设备、中断服务程序等)被改变的值,因此,每次读取这些变量...
因此,编译器在优化代码时,不能对volatile修饰的变量进行优化处理,必须在每次使用该变量时都从内存中重新读取其值,确保读取到的总是最新的值。这种特性使得volatile特别适用于硬件编程和多线程环境。 在硬件编程...