java 小册子之 volatile

java 小册子这一系列的每篇文章都会在开头提出一个面试的常见问题,大家可以当作日常的积累,每天看一看。各位读者可以先尝试回答下,笔者也会给出自己的回答,读者可以参考一下笔者的答案,如果觉得笔者的回答对你有帮助,可以点赞 + 收藏,并且分享给自己的好友。如果对笔者的回答有疑问或有个人的建议,欢迎在评论区中给出自己见解,在评论区中回复可以获得优质 java 资源哦。

volatile 关键字是什么?


首先说下 volatile 关键字可以回答的点:

  • java 内存模型
  • java 并发编程中三个重要的特性
  • volatile 关键字的语义
  • volatile 正确的使用方式

java 内存模型

java 内存模型简称 jmm ,是 java 定义的一种线程间通信与同步以及线程的工作内存与主存进行数据交互的一种规范。jmm 定义了 8 种工作内存与主存进行数据交互的原子操作:lock、unlock、read、load、use、assign、store、write;jmm 规定了线程如果需要访问主存中的共享变量,不能直接对主存中的共享变量进行修改,而是需要先将共享变量的值从主存拷贝到线程的工作内存中,并且多个线程间的工作内存不能相互访问,因此线程间通信的方式是通过线程对主存中的共享变量进行读写完成的。

java 并发编程中三个重要的特性

java 并发编程中有三个重要特性,分别是原子性、有序性和可见性。

  • 原子性的含义为:操作与操作间不能被打断,要么全部一起执行,要么不执行。不会出现只执行了一部分的而另一部分还未执行的情况

  • 有序性的含义为:在当前线程内的所有操作都是有序的,但从其他线程观察,该线程的执行可能是无序的,因为编译器和处理器会在满足 as-if-serial 语义的情况下对程序的代码指令进行重排序

  • 可见性的含义为:某个线程对共享变量做了修改操作后,其他线程能否立即感知到该修改操作对于共享变量所作出的修改。

volatile 关键字的语义

jmm 对其中的有序性和可见性提出了 happen-before 原则,如果程序员在编写多线程程序时符合 happen-before 原则,则可以保证多线程环境下的有序性和可见性。其中 volatile 关键字就可以保证多线程间的有序性和可见性,因为 happen-before 原则对 volatile 关键字做出了如下定义:对一个 volatile 域的写,happens-before 于任意后续对这个 volatile 域的读,因此某个线程如果对 volatile 所修饰的共享变量做了修改,其他线程能够感知这个变化;并且编译器会在 volatile 关键字的操作前后插入内存屏障来禁止指令的重排序。因此 volatile 关键字的内存语义分为写和读两种:读内存语义为:当读一个 volatile 变量时,JMM 会要求把该线程对应的本地内存置为无效。线程接下来将从主内存中读取共享变量。写内存语义为:当写一个 volatile 变量时,JMM 会要求把该线程对应的本地内存中的共享变量值刷新到主内存。

volatile 正确的使用方式

volatile 关键字被认为是一种轻量级的线程间同步机制,但其并不能代替锁的使用,因为 volatile 关键字无法保证复合操作的原子性,比如 i++ 就不适合用 volatile 关键字。所以 volatile 关键字适用于那些不依赖于当前值的操作。比如下面的一种场景:

 // 由其他线程修改该变量的值。由于变量由 volatile 修饰,因此在多线程环境下,某个线程修改后// 修改后的值对其他线程可见static volatile boolean flag = true; public static void main(String[] args) {new Thread(()->{while (true){if (!flag){ // 如果读取到 flag 的值为 false,则该线程停止工作并退出break;}// 下面就是该线程具体的处理逻辑}}).start();}

java 小册子之 volatile相关推荐

  1. 面试:说说Java中的 volatile 关键词?

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 作者 | Matrix海子 来源 | https://w ...

  2. null在java存在的意义何在,Java并发编程——volatile关键字

    一.volatile是什么 volatile是Java并发编程中重要的一个关键字,被比喻为"轻量级的synchronized",与synchronized不同的是,volatile ...

  3. 如何理解 JAVA 中的 volatile 关键字

    如何理解 JAVA 中的 volatile 关键字 最近在重新梳理多线程,同步相关的知识点.关于 volatile 关键字阅读了好多博客文章,发现质量高适合小白的不多,最终找到一篇英文的非常通俗易懂. ...

  4. Java并发编程 Volatile关键字解析

    volatile关键字的两层语义 一旦一个共享变量(类的成员变量.类的静态成员变量)被volatile修饰之后,那么就具备了两层语义: 1)保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了 ...

  5. Java并发编程—volatile关键字(保证变量的可见性、有序性机制)

    原文作者:Matrix海子 原文地址:Java并发编程:volatile关键字解析 volatile这个关键字可能很多朋友都听说过,或许也都用过.在Java 5之前,它是一个备受争议的关键字,因为在程 ...

  6. java中的Volatile关键字使用

    文章目录 什么时候使用volatile Happens-Before java中的Volatile关键字使用 在本文中,我们会介绍java中的一个关键字volatile. volatile的中文意思是 ...

  7. java allocate_Java中volatile关键字的最全总结

    一.简介 volatile是Java提供的一种轻量级的同步机制.Java 语言包含两种内在的同步机制:同步块(或方法)和 volatile 变量,相比于synchronized(synchronize ...

  8. Java中的Volatile如何工作? Java中的volatile关键字示例

    如何在Java中使用Volatile关键字 在Java采访中,什么是volatile变量以及何时在Java中使用volatile变量是Java 采访中一个著名的多线程采访问题 . 尽管许多程序员都知道 ...

  9. java中二进制怎么说_面试:说说Java中的 volatile 关键词?

    volatile 这个关键字可能很多朋友都听说过,或许也都用过.在 Java 5 之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果.在 Java 5之后,volatile 关 ...

最新文章

  1. Matlab求解混沌系统最大李雅普诺夫指数
  2. 使用Set求两个数组的并集|| 交集||差集
  3. Python 3.6学习笔记(一)
  4. java中的进制输出转换_java中进制的转换,Byte与16进制的转换
  5. 中国金融家俱乐部秋季论坛聚焦“自贸区将带来什么”展开论道
  6. 性能为王:SQL标量子查询的优化案例分析
  7. lua upvalue
  8. htc816t Android go,移动版HTC 816t刷recovery的教程与方法
  9. dosbox 实现程序编译
  10. user_agent浏览器头部
  11. 万字拆解孩子王:充满矛盾的母婴零售之王
  12. 反向题在测试问卷信效度_科学网—调查问卷的信度、效度分析方法(转载) - 谢卫军的博文...
  13. java让星星闪烁,js实现星星闪特效
  14. 清理注册表 php,如何彻底清理注册表?小编教你清理注册表操作方法
  15. 到底什么是超融合呢?
  16. Ubuntu16.04创建用户时指定工作目录
  17. 图像分析之直方图分析
  18. 测试理论-测试用例设计 (一) --- 正交表分析法
  19. 中北大学计算机应用基础课后答案,中北大学计算机与控制工程学院研究生导师介绍:秦品乐...
  20. 三光(可见光、红外光、激光)云台产品调研

热门文章

  1. 如何用CSS实现PS正片叠底等混合模式?
  2. Ubutun搭建集群遇到的一些问题
  3. 微信小程序获取的语言列表统计,微信小程序getSystemInfo获取的各种语言都叫什么?微信小程序国际化|多语言版本获取微信小程序语言大全【记录】
  4. 业务主管如何打消顾客的顾虑
  5. 傲游云浏览器开创业界先例 无缝浏览增强用户体验
  6. PIC16F877A与Proteus仿真-LCD1602并口驱动
  7. 富集分析和基因表达花样可视化
  8. cmake错误:target_compile_features specified unknown feature cxx_std_11 for target...
  9. 创业板实务大全(2022.1)
  10. 爬取18年二季度天天基金网基金持仓信息-python【转发】