问题:volatile关键字有什么用

在工作的时候,我碰到了volatile关键字。但是我不是非常了解它。我发现了这个解释

这篇文章已经解释了问题中的关键字的细节了,你们曾经用过它吗或者见过正确使用这个关键字的样例

回答

  1. Java中同步的实现大多是通过关键字synchronized和volatile和锁

  2. 在Java里面,我们没有 synchronized 的变量。对一个变量使用 synchronized 关键字是非法的,会导致编译错误的。我们可以使用volatile变量而不是synchronized变量,volatile变量会让JVM里面的线程去主存中读取volatile 变量的值并且不在本地副本里面缓存

  3. 如果一个变量没有被多个线程共享,那就不需要使用volatile关键字了。

volatile使用的例子:

public class Singleton {private static volatile Singleton _instance; // volatile variablepublic static Singleton getInstance() {if (_instance == null) {synchronized (Singleton.class) {if (_instance == null)_instance = new Singleton();}}return _instance;}
}

我们在第一次使用的时候才创建这个实例

如果我们没有给这个变量加volatile,那么创建单例的那个线程就没办法和其他线程通信。如果线程A在创建一个单例,在创建完单例以后,cpu炸了,那么其他线程就看不到这个实例了,它们就觉得这个实例还是空的。

为什么会发生这种情况?因为读线程没有加锁,直到写线程来到了同步代码块,内存没有被同步,实例的值还未被刷新到主存里。在 Volatile关键字以后,这就由Java自身处理,这样的更新是对所有的读线程可见的

Conclusion: volatile 关键字也可以用于多个线程在主存的通信

不使用volatile的例子:

public class Singleton{    private static Singleton _instance;   //without volatile variablepublic static Singleton getInstance(){   if(_instance == null){  synchronized(Singleton.class){  if(_instance == null) _instance = new Singleton(); } }   return _instance;  }

文章翻译自Stack Overflow:https://stackoverflow.com/questions/106591/what-is-the-volatile-keyword-useful-for

volatile关键字有什么用相关推荐

  1. java中实现具有传递性吗_Java中volatile关键字详解,jvm内存模型,原子性、可见性、有序性...

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

  2. volatile关键字之全面深度剖析

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

  3. c语言中volatile关键字的作用

    读文章之前 可以先看一下<程序员的自我修养 >第28页 过度优化. volatile 提醒编译器它后面所定义的变量随时都有可能改变,因此编译后的程序每次需要存储或读取这个变量的时候,都会直 ...

  4. C语言volatile关键字详解

    volatile提醒编译器它后面所定义的变量随时都有可能改变,因此编译后的程序每次需要存储或读取这个变量的时候,都会直接从变量地址中读取数据.如果没有volatile关键字,则编译器可能优化读取和存储 ...

  5. 爆赞,对 volatile 关键字讲解最好的一篇文章!

    欢迎关注方志朋的博客,回复"666"获面试宝典 最近,在一篇文章中了解到了 volatile 关键字,在强烈的求知欲趋使下,我查阅了一些相关资料进行了学习,并将学习笔记记录如下,希 ...

  6. Java并发编程:JMM和volatile关键字

    Java内存模型 随着计算机的CPU的飞速发展,CPU的运算能力已经远远超出了从主内存(运行内存)中读取的数据的能力,为了解决这个问题,CPU厂商设计出了CPU内置高速缓存区.高速缓存区的加入使得CP ...

  7. c#中volatile关键字的作用

    恐怕比较一下volatile和synchronized的不同是最容易解释清楚的.volatile是变量修饰符,而synchronized则作用于一段代码或方法:看如下三句get代码: int i1;  ...

  8. 26张图带你彻底搞懂volatile关键字

    引子 小艾吃饭路上碰上小牛,忙问:你昨天面大厂面的咋样了?听说他们最喜欢问多线程相关知识. 小牛说:对啊,第一个问题我就讲了20分钟,直接把面试官讲服了. 小艾忙问:什么问题能讲这么久?是不是问你情感 ...

  9. C++中的volatile关键字

    1.使用 volatile int i = 10; 2.使用volatile时要几个注意的点: volatile 关键字是一种类型修饰符,用它声明的类型变量表示可以被某些编译器未知的因素(操作系统.硬 ...

  10. volatile关键字的作用、原理

    在只有双重检查锁,没有volatile的懒加载单例模式中,由于指令重排序的问题,我确实不会拿到两个不同的单例了,但我会拿到"半个"单例. 而发挥神奇作用的volatile,可以当之 ...

最新文章

  1. gradle编译出错:Execution failed for task #39;:app:compileTestDebugJava#39;.
  2. 大型高并发系统的系统设计要点
  3. 学java前要学css_教你一招:学习Java必须学会的CSS用法
  4. element ui select设置不显示不存在的项_appium—等待时间设置方法
  5. 二叉树的创建_【数据结构用python描述】python创建二叉树
  6. 机器学习入门——分类算法的评价
  7. jquery html dom方式创建新html元素
  8. 同一个WiFi,电脑不能访问CSDN网站,手机却可以,换一个网络电脑就可以是什么原因?
  9. Trapcode Particular 4 for Mac(AE三维粒子插件)附序列号破解版
  10. html5 侧面板展开折叠,css实现侧边展开收起
  11. 技术负责人如何带领好团队
  12. [迅为i.MX6ULL开发板学习]内核Logo 修改使用文档
  13. U3D手游《苍穹变》性能优化经验谈
  14. AT4896 [ABC161C] Replacing Integer
  15. ❤️Java17 发布了,YYDS!重磅!Oracle 宣布 JDK 17 可以免费商用了。。
  16. 高级计算机网络知识点
  17. 普通相机也能实现超级夜景?一种普适的图像防抖算法
  18. DRAM DDR4DDR5 UDIMMRDIMM的内存测试固件开发的经验总结
  19. GetElementByName
  20. CocosCreator 创建纯色精灵(Sprite单色)组件

热门文章

  1. 【C++11新特性】 C++11智能指针之unique_ptr
  2. libevent网络编程例子(1)
  3. 爆赞!Jetpack-MVVM-高频提问和解答,满满干货指导
  4. linux 调用默认程序打开文件,Excel VBA如何使用默认应用程序打开文件
  5. Hadoop 大数据平台架构与实践
  6. WebGL——osg框架学习一
  7. Ocelot中文文档入门
  8. java常用设计模式一:单例模式
  9. [BZOJ2599][IOI2011]Race 点分治
  10. 【BZOJ1857】【SCOI2010】传送带 [三分]