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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • vue基础(学习官方文档)

    vue基础(学习官方文档)基础介绍是什么是一套用于构建用户界面的渐进式框架声明式渲染vue实例一个Vue应用由一个通过newVue创建的根Vue实例,以及可选的嵌套的、可复用的组件树组成。所有的

    2022年8月3日
    6
  • Ubuntu虚拟显示器_vmware安装ubuntu屏幕太小

    Ubuntu虚拟显示器_vmware安装ubuntu屏幕太小Ubuntu20.04虚拟显示器1080P配置一、背景二、配置方法1)安装软件2)添加配置文件3)重启三、效果Reference一、背景通过VNC远程连接Ubuntu系统电脑的图形化桌面时,如该电脑未连接显示器,需配置虚拟显示器。二、配置方法1)安装软件通过终端安装虚拟显示器软件。$sudoapt-getinstallxserver-xorg-core-hwe-18.04$sudoapt-getinstallxserver-xorg-video-dummy

    2022年8月21日
    10
  • 程序员:为什么“基础不牢”成为我薪资被砍的理由?!

    程序员:为什么“基础不牢”成为我薪资被砍的理由?!

    2021年6月14日
    133
  • Keil 使用教程(详解)「建议收藏」

    Keil 使用教程(详解)「建议收藏」(1)打开Keil,点击project新建(2)选择合适的型号,没有STC的选项,不要紧,一般C51的好多兼容的(3)不用汇编的话,下面的这个对话框选择否就可以了(4)点击新建一个文件(5)选择保存,并命名为.c(6)双击SourceGroup(7)添加.c文件(8)写完程序后,点击标号1处的按钮,然后点击标号2处的output,依次点击3和4,生成.hex文件…

    2022年5月10日
    42
  • jquery中on绑定click事件在苹果手机失效问题解决(巨坑啊)

    jquery中on绑定click事件在苹果手机失效问题解决(巨坑啊)

    2021年11月5日
    67
  • 无线网络规划与设计案例_无线网络的发展前景

    无线网络规划与设计案例_无线网络的发展前景无线网络规划与设计随着WLAN技术的成熟和终端的普及,WLAN网络承载的业务与应用逐渐丰富,为越来越多的终端用户所喜爱,各大运营商与企业也不断加大对WLAN网络建设的投入,在各热点楼宇(写字楼、酒店、机场等)规划部署WLAN网络,以满足终端用户不断上涨的业务需求。本文将对无线网络的规划设计原则加以总结和分析,可作为无线网络部署的指导意见。无线网络规划与设计当前WLAN网络采

    2022年9月28日
    2

发表回复

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

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