`
ITChaser
  • 浏览: 7802 次
  • 性别: Icon_minigender_1
  • 来自: 太原
社区版块
存档分类
最新评论

volatile关键词的原理与用途

阅读更多
本文的思想来源于:
Jeremy Manson and Brian Goetz, 《JSR 133 (Java Memory Model) FAQ》, February 2004, http://www.cs.umd.edu/~pugh/java/memoryModel/jsr-133-faq.html#synchronization


volatile字段被用来在线程之间communicate state。任意线程所read的volatile字段的值都是最新的。
原因有四:

(1) 编译器和JVM会阻止将volatile字段的值放入处理器寄存器(register);
(2) 在write volatile字段之后,其值会被flush出处理器cache,写回memory;
(3) 在read volatile字段之前,会invalidate处理器cache。因此,上述两条便保证了每次read的值都
是从memory中的。
(4) 禁止reorder任意两个volatile字段或者volatile变量,并且同时严格限制(尽管没有禁止)reorder
volatile字段(或变量)周围的非volatile字段(或变量)。

由于第(4)条中对volatile字段以及周围非volatile字段(或变量)reorder的限制,如下程序中,假设线程A
正在执行reader方法,同时,线程B正在执行writer方法。线程B完成对volatile字段 v 的赋值后,相应的结
果被写回内存。如果此时线程 A 便得到的 v 的值正好为true,那么线程A也可以安全地引用 x 的值。然而,
需要注意的是,假如v不是volatile的,那么上述结果就不一定了,因为x和v赋值的顺序可能被reorder。
		class VolatileExample {
		  int x = 0;
		  volatile boolean v = false;
		  public void writer() {
		    x = 42;
		    v = true;
		  }
		
		  public void reader() {
		    if (v == true) {
		      //uses x - guaranteed to see 42.
		    }
		  }
		}


关于上述解释的原文为:because the memory model places stricter constraints on reordering of
volatile field accesses with other field accesses, volatile or not, anything that was visible to
thread A when it writes to volatile field f becomes visible to thread B when it reads f.
分享到:
评论
4 楼 冲杯茶喝 2012-11-30  
你试过吗,文章中的代码,在windows下没有出现reorder
3 楼 ITChaser 2009-08-05  
不好意思,同一篇文章中的内容,只截取了我感兴趣的专题放上来,有些不连贯了。重新翻译了Reordering的含义部分。
请参见http://itchaser.iteye.com/blog/440335
2 楼 yumi301 2009-08-04  
因为x和v赋值的顺序可能被reorder
——————————————————
期望能解释得清楚点,是说v先被赋成true,x再赋成42,为什么会有这种可能了。
1 楼 eastone 2009-07-31  
多CPU机器上,这东西比同步还重要

相关推荐

    CC++ Volatile关键词剖析1

    ++中的`volatile`关键字之前,我们首先需要理解其基本概念。`volatile`是一个类型修饰符,用于告诉编译器某个变量的值可能会被程序外部的某些因素(如硬件中断、多线程环境或其他异步事件)改变,因此编译器不能对这...

    深入分析Volatile的实现原理

    本文将深入分析在硬件层面上Inter处理器是如何实现Volatile的,通过深入分析能帮助我们正确的使用Volatile变量。

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

    本篇文章将深入分析Volatile的实现原理,结合`LinkedTransferQueue`和`TransferQueue`这两个与并发相关的Java源码,探讨其在多线程环境中的应用。 首先,我们需要理解Java内存模型(JMM,Java Memory Model),它是...

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

    本文将详细探讨volatile关键字的工作原理、使用场景以及如何在实际开发中正确使用volatile。 volatile关键字是Java并发编程中一个重要的工具,它通过确保变量的可见性和禁止指令重排序来提高程序的并发性能。然而,...

    synchronized ReentrantLock volatile Atomic 原理分析.docx

    《Java并发编程:synchronized、ReentrantLock、volatile与Atomic深度解析》 在Java多线程编程中,正确地管理共享资源是至关重要的。本文将深入探讨四种关键的并发控制机制:synchronized关键字、ReentrantLock(可...

    关键字volatile的用途

    ### 关键字volatile的用途 #### 一、volatile的基本概念 在嵌入式系统开发过程中,程序员经常会遇到一些变量的值可能会被意外修改的情况。这些情况可能是由硬件操作、多线程并发执行或是中断服务程序导致的。为了...

    【并发编程】volatile的原理我好像又懂了.pdf

    ### 并发编程中volatile的理解 #### 一、并发编程基础 并发编程是现代软件开发中的一项重要技术,尤其在多核处理器普及的背景下显得...掌握 `volatile` 的原理及其应用场景对于编写高效、稳定的并发程序至关重要。

    JMM(Java内存模型)及Volatile底层实现原理.md

    Java内存模型及Volatile底层实现原理

    Java中volatile关键字实现原理

    Java中volatile关键字实现原理 volatile关键字是Java语言中的一种机制,用于保证变量在多线程之间的可见性。它是Java.util.concurrent包的核心,没有volatile就没有那么多的并发类供我们使用。本文详细解读一下...

    Volatile详解,深入学习Volatile

    1. Volatile与常量的区别: - 常量(如5或"abc")是放在内存的只读区域,不能被修改。 - Volatile变量则是存储在普通内存中,可以被其他线程或外部设备修改。例如,一个硬件寄存器或中断服务程序可能改变的变量就...

    java 高并发中volatile的实现原理

    与`synchronized`关键字相比,`volatile`通常具有更低的开销,但它并不提供互斥访问,即它无法保证变量的原子性。 1. **volatile的定义** `volatile`关键字在Java中用于标记一个变量,声明为`volatile`的变量表明...

    关于C语言中volatile关键字

    volatile详解 一、volatile的本意是“易变的” 因为访问...(简洁的说就是:volatile关键词影响编译器编译的结果,用volatile声明的变量表示该变量随时可能发生变化,与该变量有关的运算,不要进行编译优化,以免出错)

    java 中volatile和lock原理分析

    《Java中volatile与锁原理分析》 在多线程编程中,确保数据的一致性和可见性是至关重要的。Java提供了两种主要的机制来实现这一目标:volatile关键字和锁。本文将深入探讨这两种机制的原理,以及它们在实际编程中的...

    volatile的用法讲解

    2. volatile修饰符不能与const修饰符同时使用,因为volatile修饰符意味着变量的值可能会改变,而const修饰符意味着变量的值不能改变。 3. 使用volatile修饰符可能会影响编译器的优化,因此需要根据实际情况进行选择...

    volatile源码分析1

    在面试和技术讨论中,volatile经常成为焦点,但其工作原理却常常引发争议。本文将从JVM、C++以及汇编语言的角度深入探讨volatile的两大特性:禁止重排序和内存可见性。 1. 禁止重排序 重排序是指编译器和处理器...

    volatile详解

    #### 一、volatile的基本概念与作用 `volatile`关键字在编程语言中扮演着重要的角色,尤其是在处理并发编程、嵌入式系统开发等领域。`volatile`的中文含义通常被翻译为“易变的”,但根据描述中的观点,将其理解为...

    volatile用法

    `volatile`关键字在C语言中是一个非常重要的概念,主要用于处理多线程环境或者与硬件交互时的内存可见性问题。它的主要作用是确保对变量的修改能够立即反映到所有线程,防止编译器进行不必要的优化,使得其他线程...

    C#中volatile与lock用法

    本文实例讲述了C#中volatile与lock用法,分享给大家供大家参考。具体分析如下: 一、C#中volatile volatile是C#中用于控制同步的关键字,其意义是针对程序中一些敏感数据,不允许多线程同时访问,保证数据在任何访问...

    JUC最详细思维导图,一次了解读写锁,可重入锁,Cas原理,volatile 关键字原理

    本文将深入探讨其中的关键概念,包括读写锁、可重入锁、CAS原理以及volatile关键字。 首先,我们来看读写锁。读写锁允许多个线程同时进行读操作,但在写操作时,只有一个线程能够获得锁。这种设计极大地提高了并发...

Global site tag (gtag.js) - Google Analytics