`
qtlkw
  • 浏览: 307161 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

volatile 注意事项

    博客分类:
  • JAVA
 
阅读更多
转载: 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关键字修改之后,还是会存在并发的情况。
分享到:
评论

相关推荐

    Java使用volatile关键字的注意事项

    **使用`volatile`的注意事项:** 1. **运算结果不依赖当前值**:如果你的变量只被用来作为状态标志,比如一个布尔值`flag`,并且它的赋值操作不依赖于其当前值,那么可以使用`volatile`。例如,`flag = true`或`...

    C++中volatile和mutable关键字用法详解

    使用volatile注意事项有六点: 1. 编译器会对带有volatile关键字的变量禁用优化,确保每次操作该变量时一定要从内存中取出,而不是使用已经存在寄存器中的值。 2. 当多个线程都要用到某一个变量且该变量的值会被...

    stm32 volatile变量的正确使用

    本文将深入探讨`volatile`关键字的基本概念、使用场景以及注意事项,并结合实际示例来帮助读者更好地理解和应用这一概念。 #### `volatile`关键字详解 在C语言中,`volatile`是一个类型限定符,用于告知编译器不要...

    volatile的用法

    10. volatile在实际编程中的注意事项:尽管volatile可以保证变量在多线程或中断环境下的正确访问,但过多地使用volatile也可能会导致程序效率下降。因此,在使用volatile时应谨慎,并且评估其对程序性能的可能影响。...

    const extern static volatile 小结

    3. **注意事项**: - 使用 `const` 定义的常量必须在定义时初始化。 - 对于数组和字符串等复合数据类型,`const` 的用法需要特别注意,以确保正确地限定数据的可变性。 #### 二、Extern(外部声明) `extern` ...

    java volatile关键字使用方法及注意事项

    volatile关键字在Java编程语言中扮演着重要的角色,特别是在多线程环境下的同步和可见性问题。它是Java内存模型(JMM)的一部分,用于确保共享变量的可见性和有序性,但不保证原子性。 1. **volatile的可见性**:当...

    单片机-#define XBYTE ((unsigned char volatile xdata *) 0)

    #### 注意事项 1. **内存对齐**:在访问外部RAM时,需要注意内存对齐问题,确保访问的数据类型与存储空间的对齐方式相匹配。 2. **指针运算**:使用指针访问外部RAM时,应谨慎处理指针运算,确保指针始终指向有效...

    【C语言】Volatile的陷阱

    C语言volatile关键字的陷阱和注意事项 本文将从 volatile 关键字的使用陷阱和注意事项入手,详细解释 volatile 关键字的使用方法和注意事项,以避免在嵌入式开发中遇到的问题。 volatile 关键字的使用注意事项 ...

    volatile用法

    #### 使用`volatile`的注意事项 1. **性能开销**:使用`volatile`虽然能保证可见性和禁止指令重排,但这些特性是以牺牲性能为代价的。频繁地访问`volatile`变量会导致更多的内存访问,从而降低程序的运行效率。 2....

    关键字volatile的用途

    #### 五、注意事项 1. **性能影响**:虽然`volatile`关键字可以帮助解决变量值意外变化的问题,但它也可能对程序的性能产生负面影响。由于每次访问`volatile`变量都需要从内存中读取数据,这可能导致额外的性能开销...

    C语言中volatile的用法

    #### 使用`volatile`的注意事项 尽管`volatile`在处理特殊变量时非常有用,但它也有一些局限性和使用上的注意事项: 1. **性能影响**:由于`volatile`抑制了编译器的优化,频繁访问`volatile`变量可能导致程序性能...

    一文精通Java中的volatile关键字

    本文将深入探讨`volatile`的关键特性、工作原理以及使用注意事项。 1. 可见性: `volatile`关键字保证了当一个线程修改了共享变量的值,其他线程可以立即看到这个修改。在上述示例中,如果没有使用`volatile`,线程...

    const和volatile.pdf

    3. `volatile`的注意事项 虽然`volatile`保证了变量的可见性,但它并不能解决数据同步问题。在多线程环境下,仅使用`volatile`可能不足以保证线程安全,还需要配合锁或其他同步机制。 总结: `const`和`volatile`...

    volatile 的作用

    #### 注意事项 尽管 `volatile` 提供了一些重要的功能,但在使用时也需要特别注意以下几点: 1. **不保证原子性**:`volatile` 并不能保证对变量的读写操作是原子性的,因此在需要保证原子性的场景下还需要结合...

    C语言中的volatile关键字:深入解析与应用实践

    `volatile`的注意事项 - **不要滥用`volatile`**:只在确实需要的地方使用它,因为滥用会导致不必要的性能损失。 - **`volatile`不是同步工具**:在多线程环境中,`volatile`不能替代锁或其他同步机制来保证原子性...

    java入门教程:数据类型_Java理论与实践如何正确使用Volatile变量.docx

    #### 使用示例与注意事项 为了更好地理解如何正确使用`volatile`变量,我们可以参考一个实际的例子: ```java public class NumberGenerator { private volatile int counter = 0; // 使用volatile标记counter ...

    Java Volatile 变量详解及使用方法

    **注意事项**: 使用`volatile`代替`synchronized`可以减少锁的使用,提高程序的性能,但并不是所有场景都适用。如果一个变量的修改依赖于其当前值,或者涉及到多个变量的复杂操作,那么还是需要使用`synchronized`...

Global site tag (gtag.js) - Google Analytics