首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

volatile 详解

volatile是Java虚拟机提供的轻量级的同步机制 保证可见性 不保证原子性 禁止指令重排 JMM(Java内存模型) JMM本身是一种抽象的概念模型并不真实存在,塔描述的是一组规则或规范,通过这组规范定义了程序中各个变量...class MyData { int number; public void setNumber60() { number = 60; } } /** * 验证volatile...可见性 * * 假如int number = 0; 没有添加volatile关键字 */ public class VisiblenessTest { public static void...修饰number后 class MyData { volatile int number; public void setNumber60() { number = 60...number++; } } /** * 验证volatile的原子性 * * 原子性:不可分割,完整性,即某个线程正在做某个业务是,中间不可以呗分割,需要整体完成,要不同时成功,要不同时失败

1.6K54

volatile详解

可见性的特性总结为以下2点: 对volatile变量的写会立即刷新到主存 对volatile变量的读会读主存中的新值 可以用如下图更清晰的描述: 如此一来,就不会出现死循环了。...volatile变量的原子性 我看了很多文章,有些文章甚至是出版的书籍都说volatile不是原子的,他们举的例子是i++操作,i++本身不是原子操作,是读并写,我这里要讲的原子性指的是写操作,原子性的特别总结为...2点: 对一个volatile变量的写操作,只有所有步骤完成,才能被其它线程读取到。...因此如果将user声明为volatile的,那么步骤2,3将不会被重排序。...修改后的单例模式代码如下: 对volatile理解的误区 很多人会认为对volatile变量的所有操作都是原子性的,比如自增i++ 这其实是不对的。

27210
您找到你想要的搜索结果了吗?
是的
没有找到

volatile详解

不能将在对volatile变量访问的语句放在其后面执行,也不能把volatile变量后面的语句放到其前面执行。...可能上面说的比较绕,举个简单的例子: //x、y为非volatile变量 //flag为volatile变量 x = 2; //语句1 y = 0; //语句2 flag...volatile实现禁止指令重排的原理 volatile关键字通过提供“内存屏障”的方式来防止指令被重排序,为了实现volatile的内存语义,编译器在生成字节码时,会在指令序列中插入内存屏障来禁止特定类型的处理器重排序...下面是基于保守策略的JMM内存屏障插入策略: 在每个volatile写操作的前面插入一个StoreStore屏障。 在每个volatile写操作的后面插入一个StoreLoad屏障。...在每个volatile读操作的前面插入一个LoadLoad屏障。 在每个volatile读操作的后面插入一个LoadStore屏障。

36620

java volatile详解

本篇来自java并发编程实战关于volatile的总结。 要说volatile,先得明白内存可见性。那我们就从内存可见性说起。...二、Volatile变量 java语言提供了一种稍弱的同步机制,即volatile变量,用来确保将变量的更新操作通知到其他线程。...当把变量声明为volatile类型后,编译器与运行时都会注意到这个变量是共享的,因此不会将该变量上的操作和其他内存操作一起重排序。...volatile变量不会被缓存在寄存器或者对其他处理器不可见的地方,因此在读取volatile类型的变量时总会返回最新写入的值。...volatile与加锁机制的区别: 加锁机制既可以确保可见性又可以确保原子性,而volatile变量只能确保可见性。

24120

volatile详解

说回到volatile volatile volatile 是java虚拟机提供的轻量级同步机制 导致并发问题的源头是 : 多核 CPU 缓存导致程序的可见性问题、多线程间切换带来的原子性问题以及编译优化带来的顺序性问题...下面是三个volatile特性 可见性 用代码证明volatile的可见性 class MyDate { //共享变量 1.1 首先不加volatile关键字 int number...1.2 证明volatile可见性 ,我们在 int number前面加上volatile关键字 volatile int number = 0; 此时main线程由可见性及时知道了主内存中的number...addWithAtomic(){ atomicInteger.getAndIncrement(); } 至于为什么AtomicInteger能保证原子性,后面有机会继续详解...写 读 volatile 使用场景 DCL(双重检查锁)+ volatile的单例模式 public class Singleton { private static

17510

volatile变量详解

关于volatile变量的可见性,经常会被开发人员误解,认为以下描述成立:“volatile变量对所有线程是立即可见的,对volatile变量所有的写操作都能立刻反应到其他线程之中,换句话说,volatile...下面代码是一段标准的DCL单例代码,可以观察加入volatile和未加入volatile关键字时所生成汇编代码的差别。...解决了volatile的语义问题,再来看看在众多保障并发安全的工具中选用volatile的意义——它能让我们的代码比使用其他的同步工具更快吗?...volatile就会比synchronized快多少。...不过即便如此,大多数场景下volatile的总开销仍然要比锁低,我们在volatile与锁之中选择的唯一依据仅仅是volatile的语义能否满足使用场景的需求。

51520

volatile底层原理详解

volatile底层原理详解 开设这个公众号是给自己一个锻炼,将自己的知识分享,以后会持续输出,希望给读者朋友们带来帮助。...今天我们聊聊volatile底层原理; Java语言规范对于volatile定义如下: Java编程语言允许线程访问共享变量,为了确保共享变量能够被准确和一致性地更新,线程应该确保通过排它锁单独获得这个变量...volatile实现原理 有volatile修饰的共享变量进行写操作的时候会多出Lock前缀的指令,该指令在多核处理器下会引发两件事情。 将当前处理器缓存行数据刷写到系统主内存。...但是加上volatile就没问题了。 volatile boolean flag = false; while(!...inited ){ sleep() } doSomethingwithconfig(context); double check volatile底层原理详解class Singleton{

33630

高并发编程-volatile详解

主内存与工作内存 在介绍volatile之前,先简单了解一下Java内存模型。...volatile 当使用volatile关键字修饰共享变量(实例变量、静态变量)时,它将具备两个特性:可见性和禁止指令重排序优化。...关于volatile实现的可见性可能会误解,认为既然volatile变量所有的写操作都会立刻反应到其它线程中,那么对volatile变量进行并发操作就是安全的。...有这个误解是因为忽略了原子性,volatile是不保证原子性的。...使用条件 虽然volatile可以实现最轻量级的同步机制,但是使用volatile修饰的变量必须满足以下两个条件: 对变量的写操作不依赖于当前值,或者确保只有一个线程修改变量的值; 该变量没有包含在具有其他变量的不变式中

63140

volatile关键字详解

今天我们来学习一下volatile关键字,volatile关键字想必大家在平时编程中都见过或用过。可是小伙伴们有没有想过什么时候需要使用volatile关键字吗?...使用volatile可以防止这种重排。 volatile int flag = 0; // ......优化和volatileunsetunset 尽管volatile告诉编译器不要对变量进行优化,但并不代表所有编译器都会完全忽略对volatile变量的优化。...某些情况下,编译器可能仍然会进行一些基本的优化,因此在使用volatile时,最好查阅编译器的文档,了解它对volatile的具体处理方式。 unsetunset8....谨慎使用unsetunset 尽管volatile是一个重要的关键字,但过度使用也可能导致代码可读性下降。在不涉及并发或硬件寄存器的情况下,不必滥用volatile

10710

Java的volatile关键字详解

前言 在学习ConcurrentHashMap源码的过程中,发现自己对并发编程简直是一无所知,因此打算从最基础的volatile开始学习. volatile虽然很基础,但是对于毫无JMM基础的我来说,也是十分晦涩...后来发现一篇文章(参考链接第一篇),给了我一些启示:用回答问题的方式来学习知识及写博客,因为对我这种新手来说,回答别人的问题,总比自己”演讲”要来的容易许多. volatile的用法 volatile只可以用来修饰变量...修饰. volatile的作用及原理 当一个变量被volatile修饰时,会拥有两个特性: 保证了不同线程对该变量操作的内存可见性....因为普通的变量没有保证内存可见性.即:线程1已经修改了i的值,其他的线程却没有得到这个消息. volatile保证了这一点,用volatile修饰的变量,读取操作与普通变量相同.但是写入操作发生后会立即将其刷新回主存...使用volatile关键字修饰inited变量,JVM就会阻止对inited相关的代码进行重排序.这样就能够按照既定的顺序指执行. volatile总结 volatile是轻量级同步机制,与synchronized

59430

Java中Volatile关键字详解

比如:用volatile修饰的变量,就会具有可见性。volatile修饰的变量不允许线程内部缓存和重排序,即直接修改内存。所以对其他线程是可见的。...二、Volatile原理 ----   Java语言提供了一种稍弱的同步机制,即volatile变量,用来确保将变量的更新操作通知到其他线程。...volatile变量不会被缓存在寄存器或者对其他处理器不可见的地方,因此在读取volatile类型的变量时总会返回最新写入的值。   ...在访问volatile变量时不会执行加锁操作,因此也就不会使执行线程阻塞,因此volatile变量是一种比sychronized关键字更轻量级的同步机制。 ?   ...volatile 性能:   volatile 的读性能消耗与普通变量几乎相同,但是写操作稍慢,因为它需要在本地代码中插入许多内存屏障指令来保证处理器不发生乱序执行。

47010

C语言volatile关键字详解

1.volatile和什么有关 百度翻译是这样子翻译volatile的: 图1-1 百度翻译volatile截图 volatile属于C语言的关键字,《C Primer Puls》 是这样解释关键字的...修饰 val ;具体可见: 编译器优化对自定义延时程序的影响(volatile详解实验一) 2.2多线程共享的全局变量 多线程数据安全问题一直是计算机领域十分常见的问题,为了解决这类问题,衍生出互斥锁...会出现什么问题、怎么解决此类问题、怎么去复现数据不同步问题、想看看博主有多傻逼 都看看 编译器优化对多线程数据同步的影响(volatile详解实验二) 2.3中断函数与主函数共享的全局变量 中断函数和主函数共享的全局变量需要使用...(对于只学过stm32,没有接触linux的同学可以在下面评论,博主按照需求去开实验三) 编译器优化对中断数据同步的影响(volatile详解实验三) 2.4硬件寄存器 什么叫硬件寄存器,学过硬件的同学应该不陌生...编译器优化对硬件寄存器数值的影响(volatile详解实验四) 发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/157341.html原文链接:https://javaforall.cn

40220

Java中Volatile关键字详解

但是用volatile修饰之后就变得不一样了:   第一:使用volatile关键字会强制将修改的值立即写入主存;   第二:使用volatile关键字的话,当线程2进行修改时,会导致线程1的工作内存中缓存变量...4.2.volatile保证原子性吗?   从上面知道volatile关键字保证了操作的可见性,但是volatile能保证对变量的操作是原子性吗?   ...4.3.volatile能保证有序性吗?   在前面提到volatile关键字能禁止指令重排序,所以volatile能在一定程度上保证有序性。   ...4.4.volatile的原理和实现机制   前面讲述了源于volatile关键字的一些使用,下面我们来探讨一下volatile到底如何保证可见性和禁止指令重排序的。   ...volatile关键字是无法替代synchronized关键字的,因为volatile关键字无法保证操作的原子性。

47920

Java并发:volatile关键字详解

了解volatile变量的语义对了解多线程操作的其他特性很有意义,在本文中我们将介绍volatile的语义到底是什么。...3.volatile详解 volatile的特性 Java内存模型对volatile专门定义了一些特殊的访问规则,当一个变量定义为volatile之后,它将具备两种特性。...关于volatile变量的可见性,经常会被开发人员误解,认为以下描述成立:“volatile变量对所有线程是立即可见的,对volatile变量所有的写操作都能立刻反应到其他线程之中,换句话说,volatile...volatile能保证有序性吗? 在上面volatile的特性中提到volatile关键字能禁止指令重排序,所以volatile能在一定程度上保证有序性。...要解决这个问题,只需要使用volatile关键字修饰instance对象即可。 从汇编代码分析volatile带来的变化 加入volatile关键字生成的汇编代码 ?

42230

Java多线程编程中之volatile详解

通过使用volatile关键字,可以避免线程之间的竞争条件和数据不一致性问题。本文将详细解释Java中的volatile关键字以及它在多线程编程中的应用。...一、volatile关键字的作用 在Java中,volatile关键字用于确保多线程环境下变量的可见性和顺序性。...但是,使用volatile关键字可以防止这种情况的发生。当一个共享变量被volatile修饰时,它会禁止指令重排序,确保指令按照程序顺序执行。...使用volatile修饰number变量: volatile int number = 0; 最终运行结果,主线程终止循环 通过代码案例可以看到,使用volatile修饰number变量,修改值之后会通知到主内存...// 请注意,此时number前面是加了volatile关键字修饰,volatile不保证原子性 public void addPlusPlus(){ number++

448130
领券