本文的思想来源于:
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.
分享到:
- 2009-07-29 13:25
- 浏览 1326
- 评论(4)
- 论坛回复 / 浏览 (3 / 4835)
- 查看更多
相关推荐
++中的`volatile`关键字之前,我们首先需要理解其基本概念。`volatile`是一个类型修饰符,用于告诉编译器某个变量的值可能会被程序外部的某些因素(如硬件中断、多线程环境或其他异步事件)改变,因此编译器不能对这...
本文将深入分析在硬件层面上Inter处理器是如何实现Volatile的,通过深入分析能帮助我们正确的使用Volatile变量。
本篇文章将深入分析Volatile的实现原理,结合`LinkedTransferQueue`和`TransferQueue`这两个与并发相关的Java源码,探讨其在多线程环境中的应用。 首先,我们需要理解Java内存模型(JMM,Java Memory Model),它是...
本文将详细探讨volatile关键字的工作原理、使用场景以及如何在实际开发中正确使用volatile。 volatile关键字是Java并发编程中一个重要的工具,它通过确保变量的可见性和禁止指令重排序来提高程序的并发性能。然而,...
《Java并发编程:synchronized、ReentrantLock、volatile与Atomic深度解析》 在Java多线程编程中,正确地管理共享资源是至关重要的。本文将深入探讨四种关键的并发控制机制:synchronized关键字、ReentrantLock(可...
### 关键字volatile的用途 #### 一、volatile的基本概念 在嵌入式系统开发过程中,程序员经常会遇到一些变量的值可能会被意外修改的情况。这些情况可能是由硬件操作、多线程并发执行或是中断服务程序导致的。为了...
### 并发编程中volatile的理解 #### 一、并发编程基础 并发编程是现代软件开发中的一项重要技术,尤其在多核处理器普及的背景下显得...掌握 `volatile` 的原理及其应用场景对于编写高效、稳定的并发程序至关重要。
Java内存模型及Volatile底层实现原理
Java中volatile关键字实现原理 volatile关键字是Java语言中的一种机制,用于保证变量在多线程之间的可见性。它是Java.util.concurrent包的核心,没有volatile就没有那么多的并发类供我们使用。本文详细解读一下...
1. Volatile与常量的区别: - 常量(如5或"abc")是放在内存的只读区域,不能被修改。 - Volatile变量则是存储在普通内存中,可以被其他线程或外部设备修改。例如,一个硬件寄存器或中断服务程序可能改变的变量就...
与`synchronized`关键字相比,`volatile`通常具有更低的开销,但它并不提供互斥访问,即它无法保证变量的原子性。 1. **volatile的定义** `volatile`关键字在Java中用于标记一个变量,声明为`volatile`的变量表明...
volatile详解 一、volatile的本意是“易变的” 因为访问...(简洁的说就是:volatile关键词影响编译器编译的结果,用volatile声明的变量表示该变量随时可能发生变化,与该变量有关的运算,不要进行编译优化,以免出错)
《Java中volatile与锁原理分析》 在多线程编程中,确保数据的一致性和可见性是至关重要的。Java提供了两种主要的机制来实现这一目标:volatile关键字和锁。本文将深入探讨这两种机制的原理,以及它们在实际编程中的...
2. volatile修饰符不能与const修饰符同时使用,因为volatile修饰符意味着变量的值可能会改变,而const修饰符意味着变量的值不能改变。 3. 使用volatile修饰符可能会影响编译器的优化,因此需要根据实际情况进行选择...
在面试和技术讨论中,volatile经常成为焦点,但其工作原理却常常引发争议。本文将从JVM、C++以及汇编语言的角度深入探讨volatile的两大特性:禁止重排序和内存可见性。 1. 禁止重排序 重排序是指编译器和处理器...
#### 一、volatile的基本概念与作用 `volatile`关键字在编程语言中扮演着重要的角色,尤其是在处理并发编程、嵌入式系统开发等领域。`volatile`的中文含义通常被翻译为“易变的”,但根据描述中的观点,将其理解为...
`volatile`关键字在C语言中是一个非常重要的概念,主要用于处理多线程环境或者与硬件交互时的内存可见性问题。它的主要作用是确保对变量的修改能够立即反映到所有线程,防止编译器进行不必要的优化,使得其他线程...
本文实例讲述了C#中volatile与lock用法,分享给大家供大家参考。具体分析如下: 一、C#中volatile volatile是C#中用于控制同步的关键字,其意义是针对程序中一些敏感数据,不允许多线程同时访问,保证数据在任何访问...
本文将深入探讨其中的关键概念,包括读写锁、可重入锁、CAS原理以及volatile关键字。 首先,我们来看读写锁。读写锁允许多个线程同时进行读操作,但在写操作时,只有一个线程能够获得锁。这种设计极大地提高了并发...