转自
http://blog.btnotes.com/articles/195.html
什么是volatile变量
java语言提供了一种削弱的同步机制,即volatile变量,用来确保将变量的更新操作通知到其他线程。当把变量声明为volatile类型后,编译器与运行时都会注意到这个变量是共享的,因此不会将该变量上的操作与其他内存操作一起重排序。volatile变量不会被缓存在寄存器或者对其他处理器不可见的地方,因此在读取volatile类型的变量时总会返回最新写入的值。
另外,在旧的内存模型,volatile变量不能被重排序,但它们可能会受到非volatile变量重排序的影响。这破坏了volatile字段做为一个线程到另一个线程的信号条件的有效性。在新的内存模型中volatile变量一样不能被重排序,但将不会受到非volatile变量的影响。
为什么要使用volatile
volatile变量修饰符如果使用恰当的话,它比synchronized的使用和执行成本会更低,因为它不会引起线程上下文的切换和调度。
应用volatile变量的三个原则
(1)写入变量不依赖此变量的值,或者只有一个线程修改此变量
(2)变量的状态不需要与其它变量共同参与不变约束
(3)访问变量不需要加锁
例1
volatile boolean shutdown;
public void shutdown() {
shutdown = true;
}
public void dowork() {
while (!shutdown) {
// do something
}
}
这是一个适用的场景。
例2
public static int race = 0;
public static void increase() {
race++;
}
public static int getRace() {
return race;
}
这是一个不能用volatile关键字的例子
简单的说
加锁机制既可以确保可见性又可以确保原子性,而volatile变量只能确保可见性。
分享到:
相关推荐
volatile 变量的使用场景可以分为以下几种模式: 模式 #1:状态标志 状态标志是volatile 变量的规范使用之一,用于指示发生了一个重要的一次性事件。例如,在一个服务器应用程序中,使用 volatile 变量来指示服务器...
5. **使用场景**: - 标记状态标志:`volatile`常用于标记单例模式的双重检查锁定,或者在并发组件(如信号量、屏障)中表示状态。 - 简单计数器:当多个线程同时增加一个计数器,如果计数器是`volatile`的,尽管...
在实际应用中,volatile 关键字经常用在以下几个场景中: 1. 多线程编程中,用于指定共享变量的存储类别。 2. 在使用像寄存器一样的变量时,用于指定变量的存储类别。 3. 在使用中断服务程序时,用于指定中断服务...
在 `release` 模式下,如果没有使用 `volatile`,第二次读取 `i` 的值时可能不会从内存中重新读取,而是使用之前缓存的值。但使用了 `volatile` 后,每次访问 `i` 都会从内存中重新读取,确保获取的是最新值。 ####...
本文将深入探讨`volatile`关键字的基本概念、使用场景以及注意事项,并结合实际示例来帮助读者更好地理解和应用这一概念。 #### `volatile`关键字详解 在C语言中,`volatile`是一个类型限定符,用于告知编译器不要...
下面是volatile变量的使用场景: 1. 并行设备的硬件寄存器(如:状态寄存器):这些寄存器的值可能会被外部设备改变,因此需要使用volatile修饰符来确保编译器每次都读取最新的值。 2. 一个中断服务子程序中会访问...
4. Volatile的典型应用场景: - 多线程共享变量:如信号量、标志位。 - 与硬件交互:如控制硬件寄存器,硬件状态等。 - 实时系统:在实时系统中,volatile用于确保关键变量的更新不被编译器优化掉。 5. Volatile...
### const、extern、static、volatile 的使用详解 #### 一、const 的使用 **1. 为什么使用 const** `const` 关键字在 C 和 C++ 编程语言中非常常见,它用来声明一个常量或者指定某个变量的某个方面为不可变。使用...
- 对于那些不确定是否需要使用 `volatile` 的变量,可以通过分析变量的使用场景来决定是否有必要使用。 总之,`volatile` 关键字在AVR-GCC环境中有着重要的作用,尤其是在需要处理多任务、中断等复杂场景时。正确...
volatile 变量的使用场景包括: * 多个变量之间或者某个变量的当前值与修改后值之间没有约束的情况。 * 对变量的写操作不依赖于当前值的情况。 * 该变量没有包含在具有其他变量的不变式中的情况。 在使用 volatile...
4. **应用场景**:volatile适合用于那些读操作频繁,写操作不依赖当前值,并且不需要复合操作的场景。例如,作为共享状态的标志,用于多线程间的通信,例如单例模式的双重检查锁定(Double-Check Locking)中,...
使用`volatile`关键字后,编译器会意识到该变量的值可能会被外部因素改变,因此每次访问该变量时都会从内存中重新读取其值,而不是依赖于之前保存在寄存器中的副本。这种方式虽然牺牲了一定的性能,但却能确保变量的...
1、volatile的使用场景 多个线程同时访问一个变量,CLR为了效率,允许每个线程进行本地缓存,这就导致了变量的不一致性。volatile就是为了解决这个问题,volatile修饰的变量,不允许线程进行本地缓存,每个线程的...
2. 多线程编程:在多线程环境下,当一个变量可能被其他线程修改时,应使用`volatile`,让编译器知道这个变量的值可能会在不通过程序控制的情况下发生变化。 3. 实时系统:在实时系统中,`volatile`用于声明受外部...
在C语言中,`volatile`和`const`是两个非常重要的关键字,它们在不同的场景下有着独特的用途。掌握这两个关键字不仅能够帮助开发者写出更加高效和可靠的代码,还能够在处理嵌入式系统等特定领域时发挥关键作用。 ##...
在探讨单片机C语言中`volatile`关键字的作用之前,我们首先需要理解`volatile`的基本概念及其应用场景。`volatile`是一个用于声明变量的关键字,在C语言中,使用`volatile`修饰的变量表明其值可能会在没有程序控制的...
正确使用`volatile`的场景通常局限于以下两种情况: 1. 变量的写操作不依赖于当前值,即写操作是基于全局状态或常量的。 2. 该变量没有包含在任何其他变量的不变式中,即它的值改变不会破坏其他变量的逻辑一致性。 ...
#### 二、volatile的典型应用场景 `volatile`变量通常应用于以下几种情况: 1. **并行设备的硬件寄存器(如:状态寄存器)**:这些寄存器可能会由硬件自行修改,因此需要通过`volatile`来确保程序能够正确读取其...