java关键字:volatile
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相关推荐
- java 关键字volatile的作用
用在多线程,同步变量. 线程为了提高效率,将某成员变量(如A)拷贝了一份(如B),线程中对A的访问其实访问的是B.只在某些动作时才进行A和B的同步.因此存在A和B不一致的情况.volatile就是用来 ...
- Java关键字volatile
一.内存模型的相关概念 大家都知道,计算机在执行程序时,每条指令都是在CPU中执行的,而执行指令过程中,势必涉及到数据的读取和写入.由于程序运行过程中的临时数据是存放在主存(物理内存)当中的,这时就存 ...
- java中volatile关键字的含义
转自:http://www.cnblogs.com/aigongsi/archive/2012/04/01/2429166.html 在java线程并发处理中,有一个关键字volatile的使用目前存 ...
- Java中 volatile 关键字的最全总结,快给自己查缺补漏吧!
作者:老鼠只爱大米 来源:blog.csdn.net/u012723673/article/details/80682208 一.简介 volatile是Java提供的一种轻量级的同步机制.Java ...
- java中volatile的含义_java中volatile关键字的含义
(支持原创)本篇文章非原创,原文章地址: http://www.cnblogs.com/aigongsi/archive/2012/04/01/2429166.html 在java线程并发处理中,有一 ...
- 认识Java中volatile关键字
概念 1.可见性: 可见性是一种复杂的属性,因为可见性中的错误总是会违背我们的直觉.通常,我们无法确保执行读操作的线程能适时地看到其他线程写入的值,有时甚至是根本不可能的事情.为了确保多个线程之间对内 ...
- java关键字 valotile_Java内存模型-jsr133规范介绍,java中volatile关键字的含义
最近在看<深入理解Java虚拟机:JVM高级特性与最佳实践>讲到了线程相关的细节知识,里面讲述了关于java内存模型,也就是jsr 133定义的规范. 系统的看了jsr 133规范的前面几 ...
- Java基础——volatile关键字解析
简介 volatile关键字虽然从字面上理解起来比较简单,但是要用好不是一件容易的事情.由于volatile关键字是与Java的内存模型有关的,因此在讲述volatile关键之前,我们先来了解一下与内 ...
- java中volatile关键字的含义_java中volatile关键字的含义
转自:http://www.cnblogs.com/aigongsi/archive/2012/04/01/2429166.html 在java线程并发处理中,有一个关键字volatile的使用目前存 ...
- java volatile有什么用_深入解析Java中volatile关键字的作用
在java线程并发处理中,有一个关键字volatile的使用目前存在很大的混淆,以为使用这个关键字,在进行多线程并发处理的时候就可以万事大吉. Java语言是支持多线程的,为了解决线程并发的问题,在语 ...
最新文章
- MySQL数据库时间类型datetime、bigint、timestamp的查询效率比较
- python 爬虫实例-python爬虫实例,一小时上手爬取淘宝评论(附代码)
- 【转】 Ubuntu 11.04 下安装配置 JDK 7
- BZOJ 3144 [Hnoi2013]切糕
- 曼彻斯特编码_两种编码方式以及两种帧结构
- TypeScript入门教程 之 解构
- 部署可道云_可道云-快速搭建个人用云网盘
- C++设计模式详解之适配者模式解析
- html画布实现小球沿直线下落,[面向对象的案例]在canvas画布内实现小球的随机移动...
- package ‘catkin‘ depends on non-existent package ‘python3-catkin-pkg‘
- 分布式缓存技术redis学习系列(四)——redis高级应用(集群搭建、集群分区原理、集群操作)...
- 修改卡巴斯基注册表,无限试用
- mldn魔乐java教程_MLDN魔乐JAVA Web全新视频教程(20讲)
- 设计师配色宝典!教你从零开始学配色(一)
- GPS定位的优点和缺点与室内定位
- [SugerTangYL] 时钟管理(分频器、倍频器、锁相环)Verilog
- [转]Warzone 2100(战争地带2100)
- 2023计算机毕业设计SSM最新选题之javaJava班级信息管理系统x0w9c
- 9.3 parity概述
- 内网自建yum源和apt源(含各信创系统)