Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Java volatile作用

Java volatile作用

作者头像
全栈程序员站长
发布于 2022-09-09 02:13:31
发布于 2022-09-09 02:13:31
37700
代码可运行
举报
运行总次数:0
代码可运行

大家好,又见面了,我是你们的朋友全栈君。

1、一个变量声明为volatile,就意味着这个变量被修改后其他所有使用到此变量的线程都立即可见

2、禁止指令重排序,防止在运行时不是按照代码的先后顺序执行

volatile是一种轻量级的同步机制,不会引起的线程上下文切换,可以保证可见性和禁止重排序,但不能保证原子性带来的线程安全问题。

volatile特性

可见性 当有多个线程访问同一个变量时,一个线程对此变量的修改,其他线程应该立刻可获取到修改后的值。 一个变量用volatile修饰后,当对此变量写入时,会立刻将写入后的值刷新到主存中,并且将其他线程本地内存中保存的值失效,其他线程读取此变量时,会直接从主内存中读取。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class VolatileDemo {
    private static boolean stop = true;

    public static void main(String[] args) throws InterruptedException {
        new Thread(() -> {
            while(stop){//无限循环
            }
        }).start();
        //确保上面线程先执行
        Thread.sleep(100);
        //虽然修改为false,但是上面线程依旧不会停
        stop = false;
        System.out.println("main thread end...");
    }
}

这就是可见性问题,只需要加上volatile修饰符即可。【亲测,确实是!】

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
private volatile static boolean stop = true;

指令重排序 编译器有时会为了效率,在保证不影响最终结果的前提下,会改变代码的执行顺序。 在单线程下,不会存在问题,但是在多线程下就会带来一些问题,比如单例模式中,双重锁校验,锁的对象必须用volatile修改。

单例模式:双重锁校验

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class DoubleCheck {
    private static volatile DoubleCheck doubleCheck = null;
    private DoubleCheck() {
    }
    public static DoubleCheck getInstance() {
        //第一次校验
        if (doubleCheck == null) {
            synchronized (DoubleCheck.class) {
                //第二次校验
                if (doubleCheck == null) {
                    doubleCheck = new DoubleCheck();
                }
            }
        }
        return doubleCheck;
    }
}

doubleCheck = new DoubleCheck();可以分解为3行伪代码 1、memory = allocate() //分配内存 2、ctorInstanc(memory) //初始化对象 3、doubleCheck = memory //设置doubleCheck指向刚分配的地址

转自:https://blog.csdn.net/CSDN_WYL2016/article/details/107006025

Java单例模式(一)饿汉式、懒汉式(双重校验锁)

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/161271.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
volatile关键字到底有什么作用
volatile是Java提供的一种轻量级的同步机制。Java 语言包含两种内在的同步机制:同步块(或方法)和 volatile 变量,相比于synchronized(synchronized通常称为重量级锁),volatile更轻量级,因为它不会引起线程上下文的切换和调度。但是volatile 变量的同步性较差(有时它更简单并且开销更低),而且其使用也更容易出错。
全栈程序员站长
2022/09/04
4520
volatile关键字到底有什么作用
Java的volatile关键字详解
在学习ConcurrentHashMap源码的过程中,发现自己对并发编程简直是一无所知,因此打算从最基础的volatile开始学习.
呼延十
2019/07/01
6510
Java的volatile关键字详解
深度理解 volatile 与 synchronized:并发编程的两把钥匙
在 Java 并发编程中,volatile和synchronized是保证线程安全的两大核心关键字。它们如同两把钥匙,分别应对不同场景下的并发问题,但很多开发者对其底层原理和适用场景一知半解,导致使用时频繁踩坑。本文将从原理到实践,全面解析这两个关键字的本质区别与协同作用。
tcilay
2025/08/11
480
volatile关键字及其作用
概述:本文主要介绍Java语言中的volatile关键字,内容涵盖volatile的保证内存可见性、禁止指令重排等。
全栈程序员站长
2022/09/05
4940
volatile关键字及其作用
[Java] volatile 详详解![通俗易懂]
JMM:JAVA内存模型(java memory model) 是一种抽象概念,并不真实存在,它描述的是一组规则或规范,通过这组规范定义了程序中各个变量(实例字段,静态字段和构成数组对象的元素)的访问方式。
全栈程序员站长
2022/09/08
2190
[Java] volatile 详详解![通俗易懂]
Java高级编程:volatile 与 synchronized
在多线程并发执行下,多个线程修改共享的成员变量,会出现一个线程修改了共享变量的值后,另一个线程不能直接看到修改后的变量的最新值。
DioxideCN
2022/11/07
5350
Java高级编程:volatile 与 synchronized
面试官提问:说说你对volatile关键字的理解?
在上篇文章中,我们介绍到在多线程环境下,如果编程不当,可能会出现程序运行结果混乱的问题。
Java极客技术
2023/09/21
2820
面试官提问:说说你对volatile关键字的理解?
Java 05 - volatile
保证了不同线程对共享变量操作的可见性, 即一个线程修改了某个共享变量的值, 那么这个新值对其他线程是可见的.
Reck Zhang
2021/08/11
3310
java面试题:谈谈你对volatile的理解
  最近打算整理下Java面试中频率比较高,相对比较难的一些面试题,感兴趣的小伙伴可以关注下。
用户4919348
2020/04/16
1.2K0
谈谈Java中的volatile
在《死磕GOF23种设计模式之单例模式》中,其中双重检查锁使用到了volatile关键字,本篇文章就带大家深入了解一下volatile相关的知识。
程序新视界
2022/05/09
2620
谈谈volatile
volatile通常被比喻成“轻量级的synchronized”,也是Java并发编程中比较重要的一个关键字。和synchronized不同,volatile是一个变量修饰符,只能用来修饰变量,无法修饰方法或代码块等。
Java阿呆
2020/10/26
4990
谈谈volatile
关于 Java 关键字 volatile 的总结
volatile 是 Java 的一个关键字,它提供了一种轻量级的同步机制。相比于重量级锁 synchronized,volatile 更为轻量级,因为它不会引起线程上下文的切换和调度。
Java_老男孩
2020/02/11
8450
深入理解volatile关键字?
保证了该成员变量在不同线程之间的可见性;禁止对该成员变量进行重排序,也就保证了其有序性。
技术从心
2020/06/24
5790
深入理解volatile关键字?
Java的volatile
volatile 关键字可以说是 Java 虚拟机提供的最轻量级的同步机制,但是它并不容易被正确、完整地理解,以至于许多程序员都习惯去避免使用它,遇到需要处理多线程数据竞争问题的时候一律使用 synchronized 来进行同步。了解 volatile 变量的语义对理解多线程操作的其他特性很有意义。
真正的飞鱼
2023/05/31
2410
volatile详解、原理
Java允许线程访问共享变量。为了确保共享变量能被一致、可靠地更新,线程必须确保 它是排他性地使用此共享变量,通常都是获得对这些共享变量强制排他性的同步锁。Java编程语言提供了另一种机制,volatile域变量,对于某些场景的使用 这会更加的方便。可以把变量声明为volatile,以让Java内存模型来保证所有线程都能看到这个变量的同一个值。
寻求出路的程序媛
2024/05/13
2140
volatile详解、原理
Java并发编程之 Java内存模型
JMM 即 Java Memory Model ,它从Java层面定义了 主存、工作内存 抽象概念,底层对应着CPU 寄存器、缓存、硬件内存、CPU 指令优化等。JMM 体现在以下几个方面:
Java微观世界
2025/01/21
1190
Java并发编程之 Java内存模型
读了源码,发现 volatile 如此重要!
JMM是Java内存模型,也就是Java Memory Model,简称JMM,本身是一种抽象的概念,实际上并不存在,它描述的是一组规则或规范,通过这组规范定义了程序中各个变量(包括实例字段,静态字段和构成数组对象的元素)的访问方式。
悟空聊架构
2022/05/13
3620
读了源码,发现 volatile 如此重要!
【小家java】使用volatile关键字来实现内存可见性、实现轻量级锁
volatile是Java提供的一种轻量级的同步机制,在并发编程中,它也扮演着比较重要的角色。同synchronized相比(synchronized通常称为重量级锁),volatile更轻量级,相比使用synchronized所带来的庞大开销,倘若能恰当的合理的使用volatile,自然是美事一桩。
YourBatman
2019/09/03
6500
【小家java】使用volatile关键字来实现内存可见性、实现轻量级锁
Java并发:volatile关键字详解
volatile关键字可以说是Java虚拟机提供的最轻量级的同步机制,但是它并不容易完全被正确、完整地理解,以至于许多程序员都习惯不去使用它,遇到需要处理多线程数据竞争问题的时候一律使用synchronized来进行同步。了解volatile变量的语义对了解多线程操作的其他特性很有意义,在本文中我们将介绍volatile的语义到底是什么。由于volatile关键字与Java内存模型(Java Memory Model,JMM)有较多的关联,因此在介绍volatile关键字前我们会先介绍下Java内存模型。
Java架构师必看
2021/05/18
6510
Java并发:volatile关键字详解
Java 并发:volatile 关键字解析「建议收藏」
  在 Java 并发编程中,要想使并发程序能够正确地执行,必须要保证三条原则,即:原子性、可见性和有序性。只要有一条原则没有被保证,就有可能会导致程序运行不正确。volatile关键字 被用来保证可见性,即保证共享变量的内存可见性以解决缓存一致性问题。一旦一个共享变量被 volatile关键字 修饰,那么就具备了两层语义:内存可见性和禁止进行指令重排序。在多线程环境下,volatile关键字 主要用于及时感知共享变量的修改,并使得其他线程可以立即得到变量的最新值,例如,用于 修饰状态标记量 和 Double-Check (双重检查)中。
全栈程序员站长
2022/09/14
3800
Java 并发:volatile 关键字解析「建议收藏」
相关推荐
volatile关键字到底有什么作用
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验