首先我们知道Java中的内存模型

即:线程工作内存——主内存

工作内存是线程私有的,主内存是线程共有的

变量的初始化,生成都在主内存,工作内存只有使用到该变量时才从主内存加载操作

共八中原子性操作,read,load,use,assign,store,wirte,lock,unlock

Java虚拟机规范之规定,不允许一个线程(我们称为线程A)丢弃它最近的assign操作,也就是说变量(我们称为x)在工作内存中被修改后需要同步到主内存,但是并未规定同步时间

非volatile变量太容易造成线程间不一致了,就不举例子

那么volatile一定能达到同步效果吗?可不一定,或者说绝大多情况下不能

JVM规范声明volatile的变量有两个特性:

1. 修改后立即可见性

2. 禁止指令(汇编或者机器指令的层次)重排

第一条说的是volatile变量的读写原子性,意思就是volatile读前一定会read&load,写后一定会store&wirte

那么像x++这种操作,为什么不行

分析:

x++操作实际是

  •   temp = x;
  •   temp = temp + 1;
  •   x = temp;

这里1,3都是原子操作,但是1,2,3整体并不是原子操作,也就是所线程A,B都在执行x++操作,可能会出现以下情况:

  A: temp = x;

  B: temp = x;

  A: temp = temp + 1;

  A: x = temp;

  B: temp = temp + 1;

  B: x = temp;

以上,就出现问题了!

转载于:https://www.cnblogs.com/simbaorz/p/5260813.html

Java中Volatile的理解相关推荐

  1. java关键字 valotile_Java内存模型-jsr133规范介绍,java中volatile关键字的含义

    最近在看<深入理解Java虚拟机:JVM高级特性与最佳实践>讲到了线程相关的细节知识,里面讲述了关于java内存模型,也就是jsr 133定义的规范. 系统的看了jsr 133规范的前面几 ...

  2. 沉淀再出发:关于java中的AQS理解

    沉淀再出发:关于java中的AQS理解 一.前言 在java中有很多锁结构都继承自AQS(AbstractQueuedSynchronizer)这个抽象类如果我们仔细了解可以发现AQS的作用是非常大的 ...

  3. Java中 多态的理解

    ** Java中 多态的理解 ** 多态官方定义为: 所谓多态就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量倒底会指 ...

  4. 【转载】谈谈我对Java中CallBack的理解

    谈谈我对Java中CallBack的理解 转载自: http://www.cnblogs.com/codingmyworld/archive/2011/07/22/2113514.html CallB ...

  5. 认识Java中volatile关键字

    概念 1.可见性: 可见性是一种复杂的属性,因为可见性中的错误总是会违背我们的直觉.通常,我们无法确保执行读操作的线程能适时地看到其他线程写入的值,有时甚至是根本不可能的事情.为了确保多个线程之间对内 ...

  6. 谈谈对java中分层的理解_让我们谈谈网页设计中的卡片设计

    谈谈对java中分层的理解 "I want a card", this is the first demand point that the customer said in th ...

  7. JAVA中多态的理解

    Java中多态的理解 JAVA中的多态可以简单的理解为一种事物的多种形态,当然多态是在继承的基础上有重写才存在. 标题如何理解一种事物的多种形态? 举个例子,拿人类.男人.女人来说.男人.女人.都分别 ...

  8. java中volatile

    volatile用来修饰变量.Java 语言中的 volatile 变量可以被看作是一种 "程度较轻的 synchronized":与 synchronized 块相比,volat ...

  9. java中volatile关键字

    一.Java内存模型 想要理解volatile为什么能确保可见性,就要先理解Java中的内存模型是什么样的. Java内存模型规定了所有的变量都存储在主内存中.每条线程中还有自己的工作内存,线程的工作 ...

最新文章

  1. 2020中国大学本科毕业生质量排行榜公布(附前152名)
  2. HDU - 1051 Wooden Sticks
  3. PHPROXY Encrypt 0.61
  4. java从静态代理到动态代理的理解
  5. AtCoder AGC004E Salvage Robots (DP)
  6. 浏览器兼容_查成绩浏览器不兼容怎么办?
  7. jquery完成界面无刷新加载登陆注册
  8. 一起开心寒假训练总复习
  9. mysql @ $_mysql常见笔试题
  10. 找个轻量级的Log库还挺难
  11. base64编码在silverlight中的使用
  12. 百度竞价推广之关键词的选择策略
  13. 【leetcode】【77】Combinations
  14. FAT12文件系统基本格式
  15. 集体备课模板_幼儿园集体备课教案模板课件(19页)-原创力文档
  16. 五种永久免费 内网穿透傻瓜式使用
  17. 研究:非英语背景移民更易识别澳大利亚俚语
  18. Flowable集成自定义表单001
  19. 视频教程-JavaScript实战讲解课程-Java
  20. Android仿微信调用第三方地图应用导航(高德、百度、腾讯)

热门文章

  1. NDK建立多个共享库
  2. esp32原理图设计_第十一章 ESP32的PWM全彩LED灯显示
  3. 5G NR QCL准共址详解
  4. 在Eclipse Indigo安装UML2 Tools(反向工程)
  5. Robo 3T SQL
  6. Eclipse配置C++时的三个关键环境变量
  7. 一行代码修改MarkdownPad2在Win10下实时预览字体太小
  8. Spring事务管理TransactionManager
  9. Monte carlo
  10. WIN7+wampserver2.4+zend stadio10.6.1配置Xdebug