原博文地址:http://www.cnblogs.com/dolphin0520/p/3920373.html
这里只是对上面的博文的一个简单总结,总结如下:

volatile变量保证可见性实现

volatile变量保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量的值,这新值对其他线程来说是立即可见的。如何实现:
1. volatile变量规则:对一个变量的写操作先行发生于后面对这个变量的读操作
2. volatile关键字会强制将修改的值立即写入主存;
3. 当一个线程将共享变量的值修改并将结果同步到主内存当中后,其他线程工作内存当中的缓存值就会失效,即共他线程想再次从自己的工作内存当中读取该变量进行操作时就会失败,而是需要从新从主内存当中读取。当然,如果某个线程已经在自己的自己的工作内存当中读到了该变量的旧值,那么后面操作该变量的值还是以前的值。所以在多个线程对一个变量进行自增时,总是会出现比预期值要小的结果。对示例作了图片化:
示例代码:

public class Test {public volatile int inc = 0;public void increase() {inc++;}public static void main(String[] args) {final Test test = new Test();for(int i=0;i<10;i++){new Thread(){public void run() {for(int j=0;j<1000;j++)test.increase();};}.start();}while(Thread.activeCount()>1)  //保证前面的线程都执行完Thread.yield();System.out.println(test.inc);}
}

示例图片:

 假如某个时刻,每个线程缓存的变量i的值都是从主内存当中读到的10。
 线程1在从自己的缓存当中读到10,还未进行自增操作时线程1被阻塞了;
 当然后线程2对变量进行读取并自增,并把11写入工作内存,最后写入到主存。
然后线程1接着进行加1操作,然后将11写入工作内存,最后写入主存。

  那么两个线程分别进行了一次自增操作后,i只增加了1。

  所以,在多线程下对某个int类型的变量值时,使用volatile没有任何用,Java提供了AtomicInteger这种安全的类型,其他基本类型也有对应的安全类。
 

volatile关键字适用场景

1.状态标记量

有了它修饰才能中断

volatile boolean flag = false;while(!flag){doSomething();
}public void setFlag() {flag = true;
}
volatile boolean inited = false;
//线程1:
context = loadContext();
inited = true;            //线程2:
while(!inited ){
sleep()
}
doSomethingwithconfig(context);

2.双重锁

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

Java中的volatile关键字相关推荐

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

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

  2. java中的Volatile关键字使用

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

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

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

  4. 深入理解Java中的volatile关键字

    在再有人问你Java内存模型是什么,就把这篇文章发给他中我们曾经介绍过,Java语言为了解决并发编程中存在的原子性.可见性和有序性问题,提供了一系列和并发处理相关的关键字,比如synchronized ...

  5. 自顶向下彻底理解 Java 中的 volatile 关键字

    标题 neta 自<计算机网络自顶向下> 思维导图 volatile 在 Java 中被称为轻量级 synchronized.很多并发专家引导用户远离 volatile 变量,因为使用它们 ...

  6. Java中不可或缺的关键字「volatile」

    什么是volatile关键字 volatile是Java中用于修饰变量的关键字,其可以保证该变量的可见性以及顺序性,但是无法保证原子性.更准确地说是volatile关键字只能保证单操作的原子性, 比如 ...

  7. java 中violate_Java中的volatile关键字及Cache更新

    Volatile [ˈvɑːlətl],中文解释:反复无常的,易变的,不稳定的. volatile的本意是告诉编译器,此变量的值是易变的,每次读写该变量的值时务必从该变量的内存地址中读取或写入,不能为 ...

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

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

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

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

最新文章

  1. 哪里可以找到python的免费教程-哪里有免费的python3教程啊?最好是有例子的视频教学...
  2. POJ3335(半平面交)
  3. 软件使用手册模板_【软件技巧】CATIA使用手册高级技巧54条
  4. 初识贪心——调度问题
  5. vue实现树形结构增删改查
  6. [Python图像处理] 十七.图像锐化与边缘检测之Roberts算子、Prewitt算子、Sobel算子和Laplacian算子
  7. 阻抗测试仪软件,特性阻抗测试仪 阻抗测试仪 Tektronix 泰克 TDR DSA8300
  8. 沧小海读《图解TCP/IP》笔记——第四章 IP协议
  9. 注意力机制在NLP问题中的介绍与调查-论文翻译
  10. 使用poi导出excel,及合并单元格边框显示问题
  11. 2022年“研究生科研素养提升”系列公益讲座在线测评试题及解析
  12. html表单自动编号,Q&A|如何实现会员自动编号?
  13. 联想台式机计算机接口,接口篇:四款产品接口配置横向对比_联想ThinkCentre台式电脑_台式电脑评测-中关村在线...
  14. windows平台下安装ES
  15. 实现高德坐标转GPS坐标
  16. oracle数据库imp用法,imp导入数据库的用法
  17. 视频管理软件技术分析报告(三)--VMS软件支撑技术分析
  18. Yoga14s 2021锐龙集显版更换固态硬盘及网卡的方法
  19. java实现图片与base64字符串之间的转换(不适用SUN公司的sun.misc.BASE64Encoder)
  20. 很久之前自己写的太空游戏flash

热门文章

  1. 435. 无重叠区间(贪心算法)
  2. python—多进程之进程池
  3. C++日志系统log4cxx使用总结
  4. Android实现文件下载并自动安装apk包
  5. 使用tracee编写规则追踪系统安全事件
  6. 【网络安全】Windows cmd的命令混淆学习思路
  7. 渗透工具开发——XSS平台的命令行实现
  8. Class 'PDO' not found 错误
  9. 1045 Favorite Color Stripe (30 分)【难度: 中 / 知识点: DP】
  10. 三人三鬼过河(野人与传教士过河)问题c/c++代码