Java volatile作用

Java volatile作用javavolatile作用

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

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

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

 

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

volatile特性

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

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修饰符即可。【亲测,确实是!】

private volatile static boolean stop = true;

 

在这里插入图片描述

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

单例模式:双重锁校验

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.net/161271.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Visual Studio 2008 集成SP1补丁

    Visual Studio 2008 集成SP1补丁因为安装VS2008的SP1补丁和MSDNSP1耗时太长,一直想二者集成到VS2008的安装包中;网上一搜有很多集成方案,按照上面的方案几经周折自己也集成了一个,经安装测试证明有效,下面结合搜到的

    2022年7月3日
    38
  • 程序员的搞怪代码诗建议收藏

    满园春色关不住一串代码飘出来。日照屏幕直冒烟,遥看代码挂前川。春眠不觉晓,起来敲代码。春宵一刻值千金,完事起来敲代码。洛阳亲友如相问,就说我在敲代码。夜阑卧听风吹雨,做梦还在敲代码。举头望明月,低

    2021年12月21日
    60
  • Tomcat闪退问题小结[通俗易懂]

    Tomcat闪退问题小结[通俗易懂]一、tomcat双击startup.bat启动报错思路:优先考虑没有正确配置JAVA_HOME等java环境变量,可在cmd中进入tomcat的bin目录,执行startup.bat脚本,若未正确配置JAVA_HOME等变量,会出现具体的提示信息。解决方法1:在计算机环境变量中进行配置;解决方法2:在startup.bat文件的顶端指定jdk与tomcat的包路径。二、tomcat部署项目后启动过程中出现错误闪退,无法查看具体的错误信息解决方式:设置tomcat遇到问题不闪退,具体设

    2022年5月30日
    35
  • vue pc分辨率自适应(vue页面自适应屏幕分辨率)

    依赖项目基础配置使用vue-cli生成自适应方案核心:阿里可伸缩布局方案lib-flexiblepx转rem:px2rem,它有webpack的loaderpx2rem开始先使用vue脚手架初始化一个webpack项目vueinitwebpack项目名项目初始化好了之后,进入项目目录中(cd项目名)安装lib-flexible和px2rem-loade…

    2022年4月16日
    389
  • Python解决求最大公约数和最小公倍数问题

    Python解决求最大公约数和最小公倍数问题目录一.思路分析1.欧几里得法(辗转相除法)2.穷举法(一个一个除)3.stein算法二.提高要求三.测试截图题目:求两个正整数的最大公约数和最小公倍数。基本要求:1.程序风格良好(使用自定义注释模板),两种以上算法解决最大公约数问题,提供友好的输入输出。提高要求:1.三种以上算法解决两个正整数最大公约数问题。         2.求3个正…

    2022年5月16日
    39
  • java 时间轮算法_时间轮算法(TimingWheel)是如何实现的?

    java 时间轮算法_时间轮算法(TimingWheel)是如何实现的?前言我在2.SOFAJRaft源码分析—JRaft的定时任务调度器是怎么做的?这篇文章里已经讲解过时间轮算法在JRaft中是怎么应用的,但是我感觉我并没有讲解清楚这个东西,导致看了这篇文章依然和没看是一样的,所以我打算重新说透时间轮算法。时间轮的应用并非JRaft独有,其应用场景还有很多,在Netty、Akka、Quartz、ZooKeeper、Kafka等组件中都存在时间轮的踪影。我们…

    2022年10月1日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号