`

volatile指令重排序理解

 
阅读更多
volatile优点:可见性,防止指令重排序,那如何理解指令重排序呢

从一问题开始Object object = new Object();object不为null,如何理解与解释呢
答:类加载过程分为:加载,验证,准备,解析,初始化。其中在准备阶段是给类分配内存,赋予默认值,后续进行初始化,这时object指向内存地址,是不为空的,只是地址所在的内存实际值是空。
object = new Object()分为三布:
1分配空间内存, mem = 空间;
2创建对象new Object(),调用构造初始化对象 ctorSingleton(instance);
3将地址赋给变量(将引用指向存储空间)instance = mem;
这个过程2.3不保证顺序
此问题也会引申:
双检锁的单例模式为什么需要将变量用volatile修饰。
这时候就是上面的对象,一个线程初始化为对象分为三步,理想是123,不加volatile可能会指令重排序,13走完2没走,然后线程切换,这时候单例就没有构造初始化成功,但是其他线程发现对象不为null,于是进去,又得到这个未被初始化的实例使用,导致报错。
volatile底层实现原理是
当前线程变更都会到主内存。
分享到:
评论

相关推荐

    volatile源码分析1

    在Java中,volatile关键字能够防止指令重排序,确保多线程环境下的正确性。让我们通过一个例子来理解这一点: ```java public class VolatileTest { int a = 0; volatile int b = 0; public void set() { a = ...

    深入理解 volatile 关键字.doc

    volatile关键字禁止指令重排序,其实就是指被volatile修饰的变量,其执行顺序不能被重排序。禁止重排序的实现,是使用了一个叫「内存屏障」的东西。简单地说,内存屏障的作用就是指令重排序时,不能把后面的指令重...

    Volatile.pdf

    文档内容的其他部分提到了一些关键字和概念,例如“指令重排序”、“内存可见性”、“Java内存模型(JMM)”,这些都和volatile的正确使用与理解密切相关。在Java中,理解内存模型和相关的并发机制对于编写高性能且...

    volatile的使用1

    volatile保证了在多线程环境下,对于volatile变量的读写操作遵循“单线程”语义,即保证了特定操作的执行顺序,防止了因指令重排序导致的错误。然而,这并不意味着volatile能保证整个代码块的有序性,它只保证了对...

    一文精通Java中的volatile关键字

    Java中的`volatile`关键字是多线程编程中的一个重要概念,它的主要作用是确保共享变量的可见性和禁止指令重排序。本文将深入探讨`volatile`的关键特性、工作原理以及使用注意事项。 1. 可见性: `volatile`关键字...

    volatile讲解

    简单来说,volatile能够确保对共享变量的读写操作不会被指令重排序,从而避免了多线程环境下程序行为的不确定性。 内存屏障是实现Volatile可见性的重要机制之一。它确保在volatile字段的前后,所有的内存操作都必须...

    volatile 变量的说明

    2. **禁止指令重排序**:编译器通常会对指令进行重排序以优化性能,但volatile变量的写操作后,后续读操作不能被提前,写操作前的读操作也不能被延后。这确保了对volatile变量的修改按照程序的顺序进行,防止出现...

    初见volatile.md,学习代码

    2. **有序性**:`volatile`变量的读写操作具有顺序性保障,即不会与前面或后面的非`volatile`写操作发生指令重排序。这有助于防止出现因指令重排序导致的线程安全问题。 然而,`volatile`关键字并不能解决原子性...

    深入解析Java中的volatile关键字:原理、应用与实践

    volatile关键字是Java并发编程中一个重要的工具,它通过确保变量的可见性和禁止指令重排序来提高程序的并发性能。然而,由于volatile不提供原子性,因此在进行复合操作时,仍然需要使用其他同步机制。通过理解...

    volatile学习手册

    volatile关键字通过添加内存屏障来防止指令重排序,确保在多线程环境下,对volatile变量的读写操作遵循特定的顺序,从而达到预期的效果。 7. 实际应用 在实际编程中,volatile常用于单例模式的双重检查锁定(DCL)...

    聊聊并发(一)深入分析Volatile的实现原理

    2. **禁止指令重排序**:编译器和处理器为了提高性能,可能会对执行顺序进行优化,但这种优化可能会导致数据的可见性和有序性问题。Volatile变量会阻止这种重排序,确保操作的有序性。 在Java中,Volatile的实现...

    深入探讨Java多线程中的volatile变量共6页.pd

    volatile通过添加内存屏障来防止指令重排序,确保了对volatile变量的读写操作不会与其他指令交错,从而维护了特定的执行顺序。 然而,volatile并不提供原子性保障。这意味着如果一个变量需要在多个线程之间同时进行...

    Java 多线程与并发(5-26)-关键字- volatile详解.pdf

    此外,`volatile`也无法阻止指令重排序对`volatile`变量以外的变量的影响。这意味着即使`volatile`变量的读写操作是有序的,但它们与非`volatile`变量的交互仍可能存在不确定性。 **四、总结** 总的来说,`...

    volatile相关理论知识

    这意味着volatile变量的读写操作不会被其他操作插队,避免了指令重排序带来的问题,但仍然不能代替synchronized关键字来实现线程安全的复杂操作。 总结来说,volatile关键字在Java中是解决多线程并发问题的重要工具...

    JAVA中JVM的重排序详细介绍

    重排序的目的是在不改变程序逻辑的情况下,优化指令的执行顺序,以充分利用硬件资源,如寄存器和CPU流水线。 编译期重排序发生在编译阶段,编译器会根据指令间的依赖关系调整指令序列,减少不必要的寄存器读写,...

    内存栅栏和volatile关键字1

    首先,我们要理解的是,现代计算机为了提高性能,编译器、运行时环境(如CLR)和CPU都有可能对指令进行重排序,这是为了更有效地利用缓存和执行管道。例如,方法A中的 `_answer = 123;` 和 `_complete = true;` 可能...

    解开Volatile的面纱V1.1

    - **防止指令重排序**:`volatile`变量的读写操作不会与其他非`volatile`变量的指令进行重排序,这确保了多线程环境下,对`volatile`变量的修改总是按照预期的顺序进行。 - **禁止缓存**:线程工作内存中不会保存`...

    12 什么?还有这种操作!—有序性.pdf

    在处理多线程时,开发者必须意识到指令重排序的可能性,以及如何通过使用适当的同步机制(如synchronized、volatile等)来确保代码的正确有序执行。在实现单例模式时,也需要特别注意避免因有序性问题而导致的并发...

    面试官最爱的volatile关键字.docx

    其次,volatile还具有防止指令重排序的特性。在Java内存模型中,为了优化性能,编译器可能会对指令进行重排序,但这可能导致线程安全问题。volatile的使用禁止了这种重排序,确保了特定语句的执行顺序,从而保证了...

Global site tag (gtag.js) - Google Analytics