volatile的作用:对与volatile修饰的变量,

1,保证该变量对所有线程的可见性。

2,禁止指令重排序。

Java内存模型(JMM)

原子性

i = 2; 把i加载到工作内存副本i,副本i=2,把 副本i 刷回主存。是原子的。

j = i;  从主存读 i和j 的副本到工作内存,把副本j=副本i,把副本j刷回主存。不是原子的。

i++;  即i=i+1;从主存读i的副本到工作内存,把副本i的值自增1,把副本i写回主存。不是原子的。

可见性

当一个变量被volatile修饰时,那么对它的修改会立刻刷新到主存,当其它线程需要读取该变量时(对于一条指令只读一次,比如i=i+1,读一次i;而while(flag) 每次判断只读一次,循环3次则读3次。这一点有助于理解volatile保证可见性却对非原子操作的指令i++无效),会去主存中读取最新值。

有序性

double pi = 3.14;//A

double r = 1; //B

double s= pi * r * r;//C

由于不会影响结果,JMM会对指令重排序,所以执行顺序可能是ABC,也可能是BAC,只要在单线程时不会影响结果。

假设某一指令有volatile变量,则该指令前的所有指令必然在该指令前执行,该指令后的所有指令必然在该指令后执行。

int a = 0;
bool flag = false; public void write() {
a = 2; //
flag = true; //
} public void multiply() {
if (flag) { //
int ret = a * a;//
}
}

假设线程1执行write,线程2执行multiply,ret的结果不一定是4.

如何保证i++原子性

1,syncronized,lock等(悲观锁)

2,CAS(乐观锁,比如使用AtomicInteger)

---

参考:

https://juejin.im/post/5a2b53b7f265da432a7b821c

https://www.cnblogs.com/zhengbin/p/5654805.html

Java基础 - volatile的更多相关文章

  1. java 基础 --- volatile

    问题  : volatile 解决的是什么问题 有什么应用场景 概述 某些共享变量的时候我们使用volatile 修饰,它会保证修改的值立即被更新到主存,或是从主存中获取最新的值.它的底层是如何实现的 ...

  2. Java基础教程:多线程杂谈——双重检查锁与Volatile

    Java基础教程:多线程杂谈——双重检查锁与Volatile 双重检查锁 有时候可能需要推迟一些高开销的对象初始化操作,并且只有在使用这些对象时才进行初始化.此时程序员可能会采用延迟初始化.但要正确实 ...

  3. [Java面经]干货整理, Java面试题(覆盖Java基础,Java高级,JavaEE,数据库,设计模式等)

    如若转载请注明出处: http://www.cnblogs.com/wang-meng/p/5898837.html   谢谢.上一篇发了一个找工作的面经, 找工作不宜, 希望这一篇的内容能够帮助到大 ...

  4. 最适合作为Java基础面试题之Singleton模式

    看似只是最简单的一种设计模式,可细细挖掘,static.synchronized.volatile关键字.内部类.对象克隆.序列化.枚举类型.反射和类加载机制等基础却又不易理解透彻的Java知识纷纷呼 ...

  5. Java基础知识【下】( 转载)

    http://blog.csdn.net/silentbalanceyh/article/details/4608360 (最终还是决定重新写一份Java基础相关的内容,原来因为在写这一个章节的时候没 ...

  6. Java基础加强之多线程篇(线程创建与终止、互斥、通信、本地变量)

    线程创建与终止 线程创建 Thread类与Runnable接口的关系 public interface Runnable { public abstract void run(); } public ...

  7. Java基础常见英语词汇

    Java基础常见英语词汇(共70个) ['ɔbdʒekt] ['ɔ:rientid]导向的                             ['prəʊɡræmɪŋ]编程 OO: object ...

  8. java 基础题 很基础, 很有趣

    都是一些非常非常基础的题,是我最近参加各大IT公司笔试后靠记忆记下来的,经过整理献给与我一样参加各大IT校园招聘的同学们,纯考Java基础功底, 老手们就不用进来了,免得笑话我们这些未出校门的孩纸们, ...

  9. JAVA基础知识(转)

    本文就java基础部分容易混淆的一些知识点进行了一下总结.因为Java本身知识点非常多,不可能在很短的篇幅就能叙述完,而且就某一个点来讲,如欲仔细去探究,也能阐述的非常多.这里不做全面仔细的论述,仅做 ...

随机推荐

  1. Spring Cloud第七篇 | 声明式服务调用Feign

    本文是Spring Cloud专栏的第七篇文章,了解前六篇文章内容有助于更好的理解本文: Spring Cloud第一篇 | Spring Cloud前言及其常用组件介绍概览 Spring Cloud ...

  2. windows上安装和使用ab压测工具

    ApacheBench是一款压力测试工具,用于测试http服务器请求的性能情况. 官方下载链接:https://www.apachehaus.com/cgi-bin/download.plx 百度云: ...

  3. [golang] nats的消息传递模型介绍

    目录 nats的消息传递模型 What is NATS 主题式消息(Subject-Based Messaging) 发布订阅(Publish-Subscribe) 请求应答(Request-Repl ...

  4. 笔记||Python3之循环

    循环:          循环概念:在一定条件下,重复做某件事情(代码)          while循环:1 - while 条件表达式: 循环体 2 - 当 条件表达式 == True   才执行 ...

  5. FPGA_VIP_V101 摄像头视频采集 调试总结之SDRAM引起的水平条纹噪声问题

    FPGA_VIP_V101 摄像头视频采集 调试总结之SDRAM引起的水平条纹噪声问题 此问题困扰我很近,终于在最近的项目调整中总结了规律并解决了. 因为之前对sdram并不熟悉,用得也不是太多,于是 ...

  6. Day 04 数据类型基础

    目录 什么是数据类型 为什么对数据分类 整型和浮点型统称为数字类型 整型(int) 作用 定义 使用方法 浮点型(float) 作用 定义 使用方法 强制类型转换 什么是字符串 作用 定义 使用方法 ...

  7. 比SecureCRT更好用的工具MobaXterm下载安装使用教程

    一.下载 1.官网下载:下载地址 下载左边的免费版本 2.百度网盘下载:下载地址  提取码:tbge java开发工具下载地址及安装教程大全,点这里. 更多深度技术文章,在这里. 二.安装 1.双击安 ...

  8. UWP 使用SSL证书,保证数据安全

    事情是这样的,我们后端的小伙伴升级了用户会员系统,使用了全新的GraphQL登录机制,并且采用SSL加密的方式来实现阻止陌生客户端请求的案例. GraphQL在UWP端的实现,以后有时间会单独写一篇文 ...

  9. 阿里云https证书Apache配置

    最近玩小程序,只支持https协议,于是给网站添加https支持.手上没钱,自己生成的证书不受信任,找到了阿里云的免费证书(PS:证书可以用在其他云主机上,不一定是阿里云的主机).如何购买下载不多说, ...

  10. Node6-1单元测试mocha

    1.初步简单的测试 在src新建一个math.js的文件.src/math.js module.exports ={ add:(...args)=>{ return args.reduce((p ...