转载:
http://tomcat-oracle.iteye.com/blog/1955879
以前一直没在意,一直以为volatile修饰了就高枕无忧了,但其实不然,最简单的一个场景:
Java代码 收藏代码
public class Counter {
public volatile static int count = 0;
public static void inc() {
//这里延迟1毫秒,使得结果明显
try {
Thread.sleep(1);
} catch (InterruptedException e) {
}
count++;
}
public static void main(String[] args) {
//同时启动1000个线程,去进行i++计算,看看实际结果
for (int i = 0; i < 1000; i++) {
new Thread(new Runnable() {
@Override
public void run() {
Counter.inc();
}
}).start();
}
//这里每次运行的值都有可能不同,可能为1000
System.out.println("运行结果:Counter.count=" + Counter.count);
}
}
里运行结果依然不是期望的1000,主要原因简单解释如下:
对于volatile修饰的变量,jvm虚拟机只是保证从主内存加载到线程工作内存的值是最新的.
例如假如线程1,线程2 在进行read,load 操作中,发现主内存中count的值都是5,那么都会加载这个最新的值
在线程1堆count进行修改之后,会write到主内存中,主内存中的count变量就会变为6
线程2由于已经进行read,load操作,在进行运算之后,也会更新主内存count的变量值为6
导致两个线程及时用volatile关键字修改之后,还是会存在并发的情况。
分享到:
相关推荐
**使用`volatile`的注意事项:** 1. **运算结果不依赖当前值**:如果你的变量只被用来作为状态标志,比如一个布尔值`flag`,并且它的赋值操作不依赖于其当前值,那么可以使用`volatile`。例如,`flag = true`或`...
使用volatile注意事项有六点: 1. 编译器会对带有volatile关键字的变量禁用优化,确保每次操作该变量时一定要从内存中取出,而不是使用已经存在寄存器中的值。 2. 当多个线程都要用到某一个变量且该变量的值会被...
本文将深入探讨`volatile`关键字的基本概念、使用场景以及注意事项,并结合实际示例来帮助读者更好地理解和应用这一概念。 #### `volatile`关键字详解 在C语言中,`volatile`是一个类型限定符,用于告知编译器不要...
10. volatile在实际编程中的注意事项:尽管volatile可以保证变量在多线程或中断环境下的正确访问,但过多地使用volatile也可能会导致程序效率下降。因此,在使用volatile时应谨慎,并且评估其对程序性能的可能影响。...
3. **注意事项**: - 使用 `const` 定义的常量必须在定义时初始化。 - 对于数组和字符串等复合数据类型,`const` 的用法需要特别注意,以确保正确地限定数据的可变性。 #### 二、Extern(外部声明) `extern` ...
volatile关键字在Java编程语言中扮演着重要的角色,特别是在多线程环境下的同步和可见性问题。它是Java内存模型(JMM)的一部分,用于确保共享变量的可见性和有序性,但不保证原子性。 1. **volatile的可见性**:当...
#### 注意事项 1. **内存对齐**:在访问外部RAM时,需要注意内存对齐问题,确保访问的数据类型与存储空间的对齐方式相匹配。 2. **指针运算**:使用指针访问外部RAM时,应谨慎处理指针运算,确保指针始终指向有效...
C语言volatile关键字的陷阱和注意事项 本文将从 volatile 关键字的使用陷阱和注意事项入手,详细解释 volatile 关键字的使用方法和注意事项,以避免在嵌入式开发中遇到的问题。 volatile 关键字的使用注意事项 ...
#### 使用`volatile`的注意事项 1. **性能开销**:使用`volatile`虽然能保证可见性和禁止指令重排,但这些特性是以牺牲性能为代价的。频繁地访问`volatile`变量会导致更多的内存访问,从而降低程序的运行效率。 2....
#### 五、注意事项 1. **性能影响**:虽然`volatile`关键字可以帮助解决变量值意外变化的问题,但它也可能对程序的性能产生负面影响。由于每次访问`volatile`变量都需要从内存中读取数据,这可能导致额外的性能开销...
#### 使用`volatile`的注意事项 尽管`volatile`在处理特殊变量时非常有用,但它也有一些局限性和使用上的注意事项: 1. **性能影响**:由于`volatile`抑制了编译器的优化,频繁访问`volatile`变量可能导致程序性能...
本文将深入探讨`volatile`的关键特性、工作原理以及使用注意事项。 1. 可见性: `volatile`关键字保证了当一个线程修改了共享变量的值,其他线程可以立即看到这个修改。在上述示例中,如果没有使用`volatile`,线程...
3. `volatile`的注意事项 虽然`volatile`保证了变量的可见性,但它并不能解决数据同步问题。在多线程环境下,仅使用`volatile`可能不足以保证线程安全,还需要配合锁或其他同步机制。 总结: `const`和`volatile`...
#### 注意事项 尽管 `volatile` 提供了一些重要的功能,但在使用时也需要特别注意以下几点: 1. **不保证原子性**:`volatile` 并不能保证对变量的读写操作是原子性的,因此在需要保证原子性的场景下还需要结合...
`volatile`的注意事项 - **不要滥用`volatile`**:只在确实需要的地方使用它,因为滥用会导致不必要的性能损失。 - **`volatile`不是同步工具**:在多线程环境中,`volatile`不能替代锁或其他同步机制来保证原子性...
#### 使用示例与注意事项 为了更好地理解如何正确使用`volatile`变量,我们可以参考一个实际的例子: ```java public class NumberGenerator { private volatile int counter = 0; // 使用volatile标记counter ...
**注意事项**: 使用`volatile`代替`synchronized`可以减少锁的使用,提高程序的性能,但并不是所有场景都适用。如果一个变量的修改依赖于其当前值,或者涉及到多个变量的复杂操作,那么还是需要使用`synchronized`...