volatile关键字的作用-respect】的更多相关文章

volatile关键字的含义? volatile定义的变量可能会意外的改变,改变它的情况有很多(例如:操作系统,硬件,线程),编译就不会去假设这个值,也就是说每次访问这个变量时,系统就会小心翼翼的去从内存读取这个值,而不是简单的从寄存器中读取这个值. 作用:防止编译器对该变量进行优化. 举例: 1)并行设备的硬件寄存器,存储器映射的硬件寄存器通常加volatile 例如:状态寄存器 2)中断服务程序中修改其他程序检测的变量 3)多线程任务中被共享的变量 扩展: 1.一个变量既可以是const和v…
引言:以前只是看过介绍volatile的文章,对其的理解也只是停留在理论的层面上,由于最近在项目当中用到了关于并发方面的技术,所以下定决心深入研究一下java并发方面的知识.网上关于volatile的文章非常多,但是并没有讲解非常详细的文章.(哪位要是有好的资料麻烦共享一份给我!)多数的都是一些理论讲解,没有实际的例子代码,就算有代码的也测试不出效果,总之理论总是与代码不匹配. 后来在我不懈的努力之下总算研究出一些成果,在此分享给大家!如果大家发现有错误的地方欢迎大家指正,谢谢! 在Java线程…
引言:以前只是看过介绍volatile的文章,对其的理解也只是停留在理论的层面上,由于最近在项目当中用到了关于并发方面的技术,所以下定决心深入研究一下java并发方面的知识.网上关于volatile的文章非常多,但是并没有讲解非常详细的文章.(哪位要是有好的资料麻烦共享一份给我!)多数的都是一些理论讲解,没有实际的例子代码,就算有代码的也测试不出效果,总之理论总是与代码不匹配. 后来在我不懈的努力之下总算研究出一些成果,在此分享给大家!如果大家发现有错误的地方欢迎大家指正,谢谢! 在Java线程…
在只有双重检查锁,没有volatile的懒加载单例模式中,由于指令重排序的问题,我确实不会拿到两个不同的单例了,但我会拿到"半个"单例. 而发挥神奇作用的volatile,可以当之无愧的被称为Java并发编程中"出现频率最高的关键字",常用于保持内存可见性和防止指令重排序. 保持内存可见性 内存可见性(Memory Visibility):所有线程都能看到共享内存的最新状态. 失效数据 以下是一个简单的可变整数类: public class MutableInteg…
在只有双重检查锁,没有volatile的懒加载单例模式中,由于指令重排序的问题,我确实不会拿到两个不同的单例了,但我会拿到“半个”单例. 而发挥神奇作用的volatile,可以当之无愧的被称为Java并发编程中“出现频率最高的关键字”,常用于保持内存可见性(随时见到的都是最新值)和防止指令重排序. 保持内存可见性 内存可见性(Memory Visibility):所有线程都能看到共享内存的最新状态. 失效数据 以下是一个简单的可变整数类: public class MutableInteger…
在 Java 多线程中如何保证线程的安全性?那我们可以使用 Synchronized 同步锁来给需要多个线程访问的代码块加锁以保证线程安全性.使用 synchronized 虽然可以解决多线程安全问题,但弊端也很明显:加锁后多个线程需要判断锁,较为消耗资源.所以就引出我们今天的主角——volatile 关键字,一种轻量级的解决方案. 首先我们得了解量两个概念:多线程和 JMM. 多线程 进程和线程的概念 创建线程的两种方法 线程的生命周期 Java 内存模型(JMM) JMM 的概念 JMM 的…
引言 作为 Java 初学者,几乎从未使用过 volatile 关键字.但是,在面试过程中,volatile 关键字以及其作用还是经常被面试官问及.这里给各位童靴讲解一下 volatile 关键字的作用,内容涵盖 volatile 的保证内存可见性.禁止指令重排等. 1 保证内存可见性 1.1 基本概念 可见性是指线程之间的可见性,一个线程修改的状态对另一个线程是可见的.也就是一个线程修改的结果,另一个线程马上就能看到. 1.2 实现原理 当对非volatile变量进行读写的时候,每个线程先从主…
const关键字: 1.欲阻止一个变量被改变,可使用const,在定义该const变量时,需先初始化,以后就没有机会改变他了: 2.对指针而言,可以指定指针本身为const,也可以指定指针所指的数据为const,或二者同时指定为const: 3.在一个函数声明中,const可以修饰形参表明他是一个输入参数,在函数内部不可以改变其值: 4.对于类的成员函数,有时候必须指定其为const类型,表明其是一个常函数,不能修改类的成员变量: 5.对于类的成员函数,有时候必须指定其返回值为const类型,以…
volatile作用总结: 1. 强制线程从公共内存中取得变量的值,而不是从线程的私有的本地内存中,volatile修饰的变量不具有原子性(修改一个变量的值不能同步). 2. 保证volatile修饰的变量在被一个线程修改后,会被强制立即刷新到主存(可见性),其他线程如果有该变量的缓存行,会被设置为无效. 3. 禁止指令重排(有序性). a.happen-before b.编译器在生成字节码时, 会在指令序列中插入内存屏障,会多出一个 lock 前缀指令 内存屏障是一组处理器指令,解决禁止指令重…
原文链接:https://blog.csdn.net/xuwentao37x/article/details/27804169 多线程的程序是出了名的难编写.难验证.难调试.难维护,这通常是件苦差事.不正确的多线程程序可能可以运行很多年也不出一点错,直到满足某些临界的条件时,才出现意想不到的奇怪错误. 不用说,编写多线程程序的程序员需要使用可能得到的所有帮助.这期专栏将专注于讨论竞争条件(race conditions)——这通常是多线程程序中各种麻烦的根源——深入了解它并提供一些工具来防止竞争…
volatile的作用 volatile关键字是防止在共享的空间发生读取的错误.只保证其可见性,不保证原子性:使用volatile指每次从内存中读取数据,而不是从编译器优化后的缓存中读取数据,简单来讲就是防止编译器优化. 在单任务环境中,如果在两次读取变量之间不改变变量的值,编译器就会发生优化,会将RAM中的值赋值到寄存器中:由于访问寄存器的效率要高于RAM,所以在需要读取变量时,直接寄存器中获取变量的值,而不是从RAM中. 在多任务环境中,虽然在两次读取变量之间不改变变量的值,在一些情况下变量…
http://blog.csdn.net/tigerjibo/article/details/7427366#comments 一.前言 1.编译器优化介绍: 由 于内存访问速度远不及CPU处理速度,为提高机器整体性能,在硬件上引入硬件高速缓存Cache,加速对内存的访问.另外在现代CPU中指令的执行并不一 定严格按照顺序执行,没有相关性的指令可以乱序执行,以充分利用CPU的指令流水线,提高执行速度.以上是硬件级别的优化.再看软件一级的优化:一种是在 编写代码时由程序员优化,另一种是由编译器进行…
转(http://m.jb51.net/article/41185.htm)Java语言是支持多线程的,为了解决线程并发的问题,在语言内部引入了 同步块 和 volatile 关键字机制 在java线程并发处理中,有一个关键字volatile的使用目前存在很大的混淆,以为使用这个关键字,在进行多线程并发处理的时候就可以万事大吉. Java语言是支持多线程的,为了解决线程并发的问题,在语言内部引入了 同步块 和 volatile 关键字机制. synchronized 同步块大家都比较熟悉,通过…
一.前言 1.编译器优化介绍: 由于内存访问速度远不及CPU处理速度,为提高机器整体性能,在硬件上引入硬件高速缓存Cache,加速对内存的访问.另外在现代CPU中指令的执行并不一定严格按照顺序执行,没有相关性的指令可以乱序执行,以充分利用CPU的指令流水线,提高执行速度.以上是硬件级别的优化.再看软件一级的优化:一种是在编写代码时由程序员优化,另一种是由编译器进行优化.编译器优化常用的方法有:将内存变量缓存到寄存器:调整指令顺序充分利用CPU指令流水线,常见的是重新排序读写指令.对常规内存进行优…
static 和final static  静态修饰关键字,可以修饰 变量,程序块,类的方法: 当你定义一个static的变量的时候jvm会将将其分配在内存堆上,所有程序对它的引用都会指向这一个地址而不会重新分配内存: 修饰一个程序块的时候(也就是直接将代码写在static{...}中)时候,虚拟机就会优先加载静态块中代码,这主要用于系统初始化: 当修饰一个类方法时候你就可以直接通过类来调用而不需要新建对象. final 只能赋值一次:修饰变量.方法及类, 当你定义一个final变量时,jvm会…
一.前言 1.编译器优化介绍: 由于内存访问速度远不及CPU处理速度,为提高机器整体性能,在硬件上引入硬件高速缓存Cache,加速对内存的访问.另外在现代CPU中指令的执行并不一定严格按照顺序执行,没有相关性的指令可以乱序执行,以充分利用CPU的指令流水线,提高执行速度.以上是硬件级别的优化.再看软件一级的优化:一种是在编写代码时由程序员优化,另一种是由编译器进行优化.编译器优化常用的方法有:将内存变量缓存到寄存器:调整指令顺序充分利用CPU指令流水线,常见的是重新排序读写指令.对常规内存进行优…
背景&问题 在早期的JVM中,synchronized存在巨大的性能开销.因此,有人想出了一个"聪明"的技巧:双重检查锁定(Double-Checked Locking).人们想通过双重检查锁定来降低同步的开销.下面是使用双重检查锁定来实现延迟初始化的示例代码. public class DoubleCheckedLocking { // 1 private static Instance instance; // 2 public static Instance getIns…
一.内存模型的相关概念 大家都知道,计算机在执行程序时,每条指令都是在CPU中执行的,而执行指令过程中,势必涉及到数据的读取和写入.由于程序运行过程中的临时数据是存放在主存(物理内存)当中的,这时就存在一个问题,由于CPU执行速度很快,而从内存读取数据和向内存写入数据的过程跟CPU执行指令的速度比起来要慢的多,因此如果任何时候对数据的操作都要通过和内存的交互来进行,会大大降低指令执行的速度.因此在CPU里面就有了高速缓存. 也就是,当程序在运行过程中,会将运算需要的数据从主存复制一份到CPU的高…
源地址:http://blog.csdn.net/tigerjibo/article/details/7427366 一.前言 1.编译器优化介绍: 由于内存访问速度远不及CPU处理速度,为提高机器整体性能,在硬件上引入硬件高速缓存Cache,加速对内存的访问.另外在现代CPU中指令的执行并不一定严格按照顺序执行,没有相关性的指令可以乱序执行,以充分利用CPU的指令流水线,提高执行速度.以上是硬件级别的优化.再看软件一级的优化:一种是在编写代码时由程序员优化,另一种是由编译器进行优化.编译器优化…
因为访问寄存器要比访问内存单元快的多,所以编译器一般都会作减少存取内存的优化,但有可能会读脏数据.当要求使用volatile声明变量值的时候,系统总是重新从它所在的内存读取数据,即使它前面的指令刚刚从该处读取过数据.精确地说就是,遇到这个关键字声明的变量,编译器对访问该变量的代码就不再进行优化,从而可以提供对特殊地址的稳定访问:如果不使用valatile,则编译器将对所声明的语句进行优化.(简洁的说就是:volatile关键词影响编译器编译的结果,用volatile声明的变量表示该变量随时可能发…
简介Java 语言提供了一种稍弱的同步机制,即 volatile 变量,用来确保将变量的更新操作通知到其他线程.volatile 变量具备两种特性:变量可见性.禁止重排序. 作为同步锁在访问 volatile 变量时不会执行加锁操作也就不会使执行线程阻塞,因此 volatile 变量是一种比 sychronized 关键字更轻量级的同步机制.当对非 volatile 变量进行读写的时候,每个线程先从内存拷贝变量到 CPU 缓存中.如果计算机有多个 CPU,每个线程可能在不同的 CPU 上被处理,…
近日,在学习<ARM处理器裸机开发实战--机制而非策略>一书,在TQ2440开发板上,按照书中实例以及光盘配套程序源代码进行Timer0中断试验,编译成功后烧写到开发板上,没有任何反应,反复检查代码,一直没有找出哪里有问题,就是到开发板上没有预期效果.(让人纠结的很) 最终参考了TQ2440之定时器中断0的程序代码,编译成功后,烧写到板子上,惊喜出现了.绝对是久旱逢甘霖的感觉,在这里对TQ2440之定时器中断0的原创作者表示感谢. 后来,经过代码对比,发现两个可疑的地方: (1)之前的Time…
1. volatile关键字的作用:保证了变量的可见性(visibility).被volatile关键字修饰的变量,如果值发生了变更,其他线程立马可见,避免出现脏读的现象.如以下代码片段,isShutDown被置为true后,doWork方法仍有执行. public class VolatileTest3 { static class Work { boolean isShutDown = false; void shutdown() { isShutDown = true; System.ou…
单例模式是程序设计中经常用到的,简单便捷的设计模式,也是很多程序猿对设计模式入门的第一节课.其中最经典的一种写法是: class Singleton { private volatile static Singleton instance;//volatile关键字防止指令重排 private Singleton(){} public static Singleton getInstance() { if ( instance == null ) { //一重判断 synchronized (S…
原文地址http://www.cnblogs.com/xrq730/p/7048693.html,转载请注明出处,谢谢 前言 我们知道volatile关键字的作用是保证变量在多线程之间的可见性,它是java.util.concurrent包的核心,没有volatile就没有这么多的并发类给我们使用. 本文详细解读一下volatile关键字如何保证变量在多线程之间的可见性,在此之前,有必要讲解一下CPU缓存的相关知识,掌握这部分知识一定会让我们更好地理解volatile的原理,从而更好.更正确地地…
转载请保留以下声明 作者:赵宗晟 出处:https://www.cnblogs.com/zhao-zongsheng/p/9092520.html 近期看到C++标准中对volatile关键字的定义,发现和java的volatile关键字完全不一样,C++的volatile对并发编程基本没有帮助.网上也看到很多关于volatile的误解,于是决定写这篇文章详细解释一下volatile的作用到底是什么. 编译器对代码的优化 在讲volatile关键字之前,先讲一下编译器的优化. int main(…
对于volatile这个关键字,相信很多朋友都听说过,甚至使用过,这个关键字虽然字面上理解起来比较简单,但是要用好起来却不是一件容易的事.这篇文章将从多个方面来讲解volatile,让你对它更加理解. 计算机中为什么会出现线程不安全的问题 volatile既然是与线程安全有关的问题,那我们先来了解一下计算机在处理数据的过程中为什么会出现线程不安全的问题.大家都知道,计算机在执行程序时,每条指令都是在CPU中执行的,而执行指令过程中会涉及到数据的读取和写入.由于程序运行过程中的临时数据是存放在主存…
我们知道volatile关键字的作用是保证变量在多线程之间的可见性,它是java.util.concurrent包的核心,没有volatile就没有这么多的并发类给我们使用.本文详细解读一下volatile关键字如何保证变量在多线程之间的可见性,在此之前,有必要讲解一下CPU缓存的相关知识,掌握这部分知识一定会让我们更好地理解volatile的原理,从而更好.更正确地地使用volatile关键字. CPU缓存CPU缓存的出现主要是为了解决CPU运算速度与内存读写速度不匹配的矛盾,因为CPU运算速…
volatile不能解决同步问题 如果想要理解volatile关键字的作用不得不先了解Java内存模型 摘抄一下来自百度百科的话 在本次线程内,当读取一个变量时,为提高存取速度,编译器优化时有时会先把变量读取到一个寄存器中:以后再取变量值时,就直接从寄存器中取值: 当变量值在本线程里改变时,会同时把变量的新值copy到该寄存器中,以便保持一致 当变量在因别的线程等而改变了值,该寄存器的值不会相应改变,从而造成应用程序读取的值和实际的变量值不一致 当该寄存器在因别的线程等而改变了值,原变量的值不会…
[原文]https://www.toutiao.com/i6592879392400081412/ 前言 我们知道volatile关键字的作用是保证变量在多线程之间的可见性,它是java.util.concurrent包的核心,没有volatile就没有这么多的并发类给我们使用. 本文详细解读一下volatile关键字如何保证变量在多线程之间的可见性,在此之前,有必要讲解一下CPU缓存的相关知识,掌握这部分知识一定会让我们更好地理解volatile的原理,从而更好.更正确地地使用volatile…