volatile

1、前提

想要很好的理解volatile的前提是要明白Java的内存模型及cpu的内存架构。

2、遇到的问题

我们知道当cpu获取一个变量值的时候不是直接从内存中取,而是先把内存中的值拷贝至cpu的告诉缓存(也有说寄存器的),cpu读取到的值永远都是高速缓存中的副本。这个在单线程模式下本来没有什么问题,但是在并发条件下就会存在脏数据的问题,比如1号线程将内存中a的值1读到高速缓存中,同时2号线程也从内存中复制了一份a的副本,这是1号线程和2号线程在缓存中存的a值都是1;之后1号线程将a值改为了2并且同步到内存中,此时2号线程什么都没做那么2号线程缓存的a值依旧是1,这就产生了脏数据,也是并发编程中的可见性问题。

3、为什么volatile解决了并发编程的可见性

Java为了解决并发编程的可见性问题,就引用volatile关键字,volatile的作用就是:当一个共享变量用volatile来修饰时,如果一个线程对该变量执行了写操作,那么就将其他线程缓存中的该变量的值置为无效,那么其他线程就必须重新从缓存中去获取该变量的值,这样就解决了脏数据的问题,也就是说用volatile修饰共享变量在被线程修改时是对其他线程透明的,这就解决了并发情况下的可见性。

4、深入理解

我觉得volatile在日常工作中不是经常用到,使用场景可以参考Java中的ConcurrentHashMap源码。至于有关于此关键字的一些理论知识如:指令重排、内存屏障,甚至包括一些c++源码字节码汇编指令,我觉得有兴趣深入研究的可以动手查一查。不懂汇编的Java程序员不是一个好程序员,我只是个渣渣程序员。

java关键字:volatile相关推荐

  1. java 关键字volatile的作用

    用在多线程,同步变量. 线程为了提高效率,将某成员变量(如A)拷贝了一份(如B),线程中对A的访问其实访问的是B.只在某些动作时才进行A和B的同步.因此存在A和B不一致的情况.volatile就是用来 ...

  2. Java关键字volatile

    一.内存模型的相关概念 大家都知道,计算机在执行程序时,每条指令都是在CPU中执行的,而执行指令过程中,势必涉及到数据的读取和写入.由于程序运行过程中的临时数据是存放在主存(物理内存)当中的,这时就存 ...

  3. java中volatile关键字的含义

    转自:http://www.cnblogs.com/aigongsi/archive/2012/04/01/2429166.html 在java线程并发处理中,有一个关键字volatile的使用目前存 ...

  4. Java中 volatile 关键字的最全总结,快给自己查缺补漏吧!

    作者:老鼠只爱大米 来源:blog.csdn.net/u012723673/article/details/80682208 一.简介 volatile是Java提供的一种轻量级的同步机制.Java ...

  5. java中volatile的含义_java中volatile关键字的含义

    (支持原创)本篇文章非原创,原文章地址: http://www.cnblogs.com/aigongsi/archive/2012/04/01/2429166.html 在java线程并发处理中,有一 ...

  6. 认识Java中volatile关键字

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

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

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

  8. Java基础——volatile关键字解析

    简介 volatile关键字虽然从字面上理解起来比较简单,但是要用好不是一件容易的事情.由于volatile关键字是与Java的内存模型有关的,因此在讲述volatile关键之前,我们先来了解一下与内 ...

  9. java中volatile关键字的含义_java中volatile关键字的含义

    转自:http://www.cnblogs.com/aigongsi/archive/2012/04/01/2429166.html 在java线程并发处理中,有一个关键字volatile的使用目前存 ...

  10. java volatile有什么用_深入解析Java中volatile关键字的作用

    在java线程并发处理中,有一个关键字volatile的使用目前存在很大的混淆,以为使用这个关键字,在进行多线程并发处理的时候就可以万事大吉. Java语言是支持多线程的,为了解决线程并发的问题,在语 ...

最新文章

  1. MySQL数据库时间类型datetime、bigint、timestamp的查询效率比较
  2. python 爬虫实例-python爬虫实例,一小时上手爬取淘宝评论(附代码)
  3. 【转】 Ubuntu 11.04 下安装配置 JDK 7
  4. BZOJ 3144 [Hnoi2013]切糕
  5. 曼彻斯特编码_两种编码方式以及两种帧结构
  6. TypeScript入门教程 之 解构
  7. 部署可道云_可道云-快速搭建个人用云网盘
  8. C++设计模式详解之适配者模式解析
  9. html画布实现小球沿直线下落,[面向对象的案例]在canvas画布内实现小球的随机移动...
  10. package ‘catkin‘ depends on non-existent package ‘python3-catkin-pkg‘
  11. 分布式缓存技术redis学习系列(四)——redis高级应用(集群搭建、集群分区原理、集群操作)...
  12. 修改卡巴斯基注册表,无限试用
  13. mldn魔乐java教程_MLDN魔乐JAVA Web全新视频教程(20讲)
  14. 设计师配色宝典!教你从零开始学配色(一)
  15. GPS定位的优点和缺点与室内定位
  16. [SugerTangYL] 时钟管理(分频器、倍频器、锁相环)Verilog
  17. [转]Warzone 2100(战争地带2100)
  18. 2023计算机毕业设计SSM最新选题之javaJava班级信息管理系统x0w9c
  19. 9.3 parity概述
  20. 内网自建yum源和apt源(含各信创系统)

热门文章

  1. 腾讯视频发布互动视频技术标准 爱奇艺、B站等均已布局
  2. iQOO高层专访:打造性能旗舰 用户满意度为先
  3. 李楠:《流浪地球》抄的经典套路 但这不是贬低
  4. 终于!华为Mate 9已获安卓9.0正式版更新
  5. 指针作为函数参数 进行内存释放 并置NULL
  6. 前端md转html添加样式_前端文档站点搭建方案
  7. 对于GetMemory()函数
  8. Qt实践录:非窗体代码片段
  9. MFC小笔记:上下控件
  10. 答网友问:一个abs函数引发的问题