`
tomcat_oracle
  • 浏览: 316833 次
社区版块
存档分类
最新评论

Java多线程的volatile关键字

阅读更多

以前一直没在意,一直以为volatile修饰了就高枕无忧了,但其实不然,最简单的一个场景:

 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关键字修改之后,还是会存在并发的情况。

11
2
分享到:
评论
4 楼 挤馒头 2013-10-14  
管家++不是原子操作,可以用AtomicInteger的addAndGet,另外楼主在打印前应该得睡会,要不然可能出现打印的时候不是所有异步线程都执行完的情况
3 楼 java-xp 2013-10-14  
1楼正解!
2 楼 blackstreet 2013-10-12  
在多线程中,比较适合做标识符, 不能做计算
1 楼 hui_windows 2013-10-12  
volatile  类型变量只能保证可见性,不能保证原子性~

相关推荐

    Java多线程 volatile关键字详解

    Java多线程volatile关键字详解 Java多线程volatile关键字详解主要介绍了Java多线程volatile关键字的应用和原理。volatile是一种轻量同步机制,可以确保变量的可见性和顺序性,但不保证原子性。 volatile关键字的...

    Java线程:volatile关键字

    Java 线程 volatile 关键字详解 Java™ 语言包含两种内在的同步机制:同步块(或方法)和 volatile 变量。volatile 变量的同步性较差,但它有时更简单并且开销更低。volatile 变量可以被看作是一种 “程度较轻的 ...

    java里的volatile关键字详解

    Java中的Volatile关键字详解是Java中的一种关键字,用于保证线程之间的可见性、原子性和有序性。下面是对Java中的Volatile关键字详解的知识点总结: 一、基本概念 1. 可见性:可见性是一种复杂的属性,因为可见性...

    Java并发编程:volatile关键字解析

    ### Java并发编程:volatile关键字解析 #### 一、内存模型的相关概念 在深入了解`volatile`关键字之前,我们首先需要理解计算机内存模型的一些基本概念。在现代计算机系统中,CPU为了提高执行效率,会将频繁访问的...

    一文精通Java中的volatile关键字

    `volatile`关键字在Java多线程编程中起到了重要的作用,它提供了轻量级的同步机制,保证了共享变量的可见性。然而,它并不提供原子性保证,因此在处理复合操作时需谨慎使用。在设计并发程序时,理解`volatile`的工作...

    多方面解读Java中的volatile关键字.rar

    同样,当写入`volatile`变量时,会立即写回主内存,保证了多线程环境下的数据一致性。 5. **使用场景**:`volatile`常用于以下场景: - 单例模式中的双重检查锁定(Double-Check Locking),确保实例化过程线程...

    Java并发volatile关键字.docx

    Java并发编程中,volatile关键字扮演着重要的角色,它是一种轻量级的同步机制,与synchronized相比,volatile在性能上更优,因为它不会导致线程阻塞。在深入理解volatile的关键特性之前,我们需要先了解Java内存模型...

    详细分析java并发之volatile关键字

    Java 中的 volatile 关键字是 Java 并发编程中的一种关键字,它用于修饰变量,确保在多线程环境下变量的可见性和有序性。volatile 关键字的主要作用是防止编译器对变量的读写优化,确保线程之间的可见性和有序性。 ...

    Java并发编程volatile关键字的作用

    volatile关键字可以使变量在多线程之间可见,确保变量的最新值被所有线程看到。 在Java内存模型中,内存分为主内存和工作内存,每个线程有自己的工作内存,对于要操作的数据会从主内存拷贝一份到工作内存中,默认...

    深入了解java并发的volatile关键字的底层设计原理.docx

    `volatile`关键字在Java语言中主要用于支持多线程环境下的变量访问安全性。它主要提供了以下两个特性: 1. **可见性**:当一个线程修改了一个被`volatile`关键字修饰的变量后,其他线程能够立即感知到这一变化。 2. ...

    深入理解Java中的volatile关键字(总结篇)

    深入理解Java中的volatile关键字 Java中的volatile关键字是一个非常重要的概念,它不仅仅在Java语言中有,在很多语言中都有的,而且其用法和语义也都是不尽相同的。volatile关键字的主要作用是提供可见性、原子性和...

    Java多线程synchronized关键字详解(六)共5

    总结来说,`synchronized`关键字在Java多线程编程中扮演着关键角色,确保了线程安全和数据一致性。然而,正确理解和使用它是至关重要的,避免滥用并结合其他并发控制手段,才能编写出高效且健壮的多线程程序。在实际...

    Java中volatile关键字实现原理

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

    Java并发教程之volatile关键字详解

    在Java中,volatile关键字是解决多线程问题的重要工具。本文将会详细介绍volatile关键字的原理、使用场景和注意事项。 知识点1:理解多线程问题 在多线程环境下,线程安全问题是最重要的问题。Java内存模型(JMM)...

    C++中volatile关键字及常见的误解总结

    在C++中,volatile关键字的定义与Java中的volatile关键字不同。C++中的volatile关键字主要用于提供对特殊地址的稳定访问,而不是用于线程同步。 在编译器对代码的优化中,编译器可能会对代码进行修改,以提高代码的...

    Java多线程volatile原理及用法解析

    Java多线程volatile原理及用法解析 Java多线程volatile原理及用法解析是Java多线程编程中一个非常重要的概念。volatile关键字是Java语言中的一个关键字,它可以保证线程之间的可见性和禁止指令重排序。 保证线程...

    深入了解Java中Volatile关键字

    Volatile关键字是Java语言中的一种关键字,主要用于解决多线程编程中的可见性、原子性和有序性问题。本文将详细介绍Volatile关键字的相关知识,并通过代码帮助大家更好地理解和学习。 一、基本概念 在Java内存模型...

    Java中Volatile关键字详解及代码示例

    在Java中,Volatile关键字可以用于解决可见性问题,例如在多线程环境下,一个线程修改的变量对另一个线程是可见的。但是,Volatile关键字不能解决原子性问题,例如a++操作是一个非原子操作,需要使用同步技术来让它...

    Java多线程之volatile关键字及内存屏障实例解析

    总结来说,volatile关键字在Java多线程编程中起着关键作用,它提供了轻量级的同步机制,通过内存屏障保证了变量的可见性和有序性,避免了多线程环境下数据不一致的问题。但需要注意的是,volatile不能保证操作的原子...

    Java中volatile关键字的总结.docx

    而在多线程环境下,通过`volatile`、`synchronized`和`Lock`可以保证一定的有序性,避免指令重排序带来的问题。 ### 二、锁的互斥与可见性 1. **互斥** 锁的互斥性确保在同一时间只有一个线程可以持有特定的锁,...

Global site tag (gtag.js) - Google Analytics