`
阅读更多
  习惯了先举个例子,这个是我学习时遇到的问题。
   volatile x = 0;
   A,B俩个线程。
   都做加一操作x=x+1。  
   输出结果A线程X=1, B线程X=1.(一种情况)
   我自己期望出现的结果:1,2。我的理解是,当A线程改变了x的值,B会及时知道,然后做加一操作,那么等到结果一定是2。可是忘了加操作和赋值是2个操作,x=x+1并非原子性。

   分析:
   1,A,B线程均读到x=0
   2,B做加一操作,等到结果为1,由于x=x+1是非原子性操作,所以此时未赋值给x
   3,A做完加一操作,主内存中x的值此时为1。
   4,由于volatile确保了可见性,所以此时B更新内存x值,此时B线程中x=1。
   5,加操作完后应该赋值了,把1赋给x,所以此时B线程中x=1。
   最后结果输出2个1。

   可以从步骤上看到,加了volatile并不会像加了synchronized一样,一个线程执行完后,另一个线程再执行,所以volatile没有确保线程的有序性。A改变x值后,B重新读取x的值,这样就如同volatile定义一样,一个线程改变了共享变量,其它线程可见,亦可见性。
   与未加volatile比,B线程是不会做第4步更新x值的操作。valatile确保线程的可见性,确保当共享变量改变时,其它线程可见。
   由于volatile只确保了可见性,所以用到它的地方,一般是赋值操作,确保了得到的值是最新的值。
分享到:
评论

相关推荐

    从汇编角度理解volatile

    一般对于volatile的解释是这样的:将变量定义为volatile可以防止编译器对变量进行优化,每次均从内存中访问变量,而不是寄存器。既然让编译器优化可以提高访问速度,那为什么又要不用它以及什么时候不用它?其实主要...

    Java中volatile关键字的作用与用法详解

    volatile关键字虽然从字面上理解起来比较简单,但是要用好不是一件容易的事情。这篇文章主要介绍了Java中volatile关键字的作用与用法详解的相关资料,需要的朋友可以参考下

    三面阿里竟然败在了volatile关键字上(一文搞懂volatile 由浅入深,直击痛点)

    小麦大叔:二面问了我一些JVM的问题,问我对于JVM内存模型的理解,还有GC的常见理解,最终还问了我下类加载机制,我看你之前水过这个 JVM系列,就依葫芦画瓢答上来了,让我准备三面。 SoWhat:麦叔这波可以啊,三面...

    深入理解JVM内存结构及运行原理全套视频加资料.txt

    2019最新深入理解JVM内存结构及运行原理(JVM调优)高级核心课程视频教程下载。JVM是Java知识体系中的重要部分,对JVM底层的了解是每一位Java... 第109讲 volatile的内存语义 00:12:04  第110讲 final域内存语义

    Java并发编程原理与实战

    深入理解volatile原理与使用.mp4 JDK5提供的原子类的操作以及实现原理.mp4 Lock接口认识与使用.mp4 手动实现一个可重入锁.mp4 AbstractQueuedSynchronizer(AQS)详解.mp4 使用AQS重写自己的锁.mp4 重入锁原理与演示....

    涵盖了90%以上的面试题

    介绍一下volatile jdk1.5新特性 jdk1.7新特性 jdk1.8新特性 java语言有哪些优点? 同一个.java文件中是否可以有多个main方法 一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制? 如何在main方法执行...

    C语言进阶-牟海军.pdf

    C语言看似简单,却不易吃透,想要运用好,更是需要积淀。本书是一本修炼C程序设计能力的进阶之作,它没有系统地去讲解C语言的语法和编程方法,而是只对C语言中不容易被初学者理解的重点、难点和疑点进行了细致而深入...

    C语言进阶 作者 Wrestle.Wu

    C语言看似简单,却不易吃透,想要运用好,更是需要积淀。本书是一本修炼C程序设计能力的进阶之作,它没有系统地去讲解C语言的语法和编程方法,而是只对C语言中不容易被初学者理解的重点、难点和疑点进行了细致而深入...

    C++编程思想(用简单的例子和简练的叙述讲解C++编程)

    1.2.4 系统更容易表达和理解 4 1.2.5 “库”使你事半功倍 4 1.2.6 错误处理 5 1.2.7 大程序设计 5 1.3 方法学介绍 5 1.3.1 复杂性 5 1.3.2 内部原则 6 1.3.3 外部原则 7 1.3.4 对象设计的五个阶段 9 1.3.5 方法承诺...

    C++编程思想(用简单的例子和简练的叙述讲解C++编程)

    1.2.4 系统更容易表达和理解 4 1.2.5 “库”使你事半功倍 4 1.2.6 错误处理 5 1.2.7 大程序设计 5 1.3 方法学介绍 5 1.3.1 复杂性 5 1.3.2 内部原则 6 1.3.3 外部原则 7 1.3.4 对象设计的五个阶段 9 1.3.5 方法承诺...

    C++编程思想,用简单的例子和简练的叙述讲解C++编程,别具特色。

    1.2.4 系统更容易表达和理解 4 1.2.5 “库”使你事半功倍 4 1.2.6 错误处理 5 1.2.7 大程序设计 5 1.3 方法学介绍 5 1.3.1 复杂性 5 1.3.2 内部原则 6 1.3.3 外部原则 7 1.3.4 对象设计的五个阶段 9 1.3.5 方法承诺...

    龙果 java并发编程原理实战

    第18节深入理解volatile原理与使用00:28:30分钟 | 第19节JDK5提供的原子类的操作以及实现原理00:27:10分钟 | 第20节Lock接口认识与使用00:19:54分钟 | 第21节手动实现一个可重入锁00:26:31分钟 | 第22节...

    Java 并发编程原理与实战视频

    第18节深入理解volatile原理与使用00:28:30分钟 | 第19节JDK5提供的原子类的操作以及实现原理00:27:10分钟 | 第20节Lock接口认识与使用00:19:54分钟 | 第21节手动实现一个可重入锁00:26:31分钟 | 第22节...

    龙果java并发编程完整视频

    第18节深入理解volatile原理与使用00:28:30分钟 | 第19节JDK5提供的原子类的操作以及实现原理00:27:10分钟 | 第20节Lock接口认识与使用00:19:54分钟 | 第21节手动实现一个可重入锁00:26:31分钟 | 第22节...

    java并发编程

    第18节深入理解volatile原理与使用00:28:30分钟 | 第19节JDK5提供的原子类的操作以及实现原理00:27:10分钟 | 第20节Lock接口认识与使用00:19:54分钟 | 第21节手动实现一个可重入锁00:26:31分钟 | 第22节...

Global site tag (gtag.js) - Google Analytics