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


相关推荐

  • java 4种 布局方法_JAVA布局模式:GridBagConstraints终极技巧

    java 4种 布局方法_JAVA布局模式:GridBagConstraints终极技巧JAVA布局模式:GridBagConstraints终极技巧(2006-11-1421:07:33)最近正在修改《公交线路查询系统》,做系统的时候都是用NULL布局,由于NULL布局调用windows系统的API,所以生成的程序无法在其他平台上应用,而且如果控件的数量很多,管理起来也比较麻烦,最近我发现一个非常强大的布局模式:GridBagConstraints布局,先发一个实例:gridx…

    2025年10月13日
    5
  • wing是什么_nativepage原理

    wing是什么_nativepage原理给定 n 本书,编号为 1∼n。在初始状态下,书是任意排列的。在每一次操作中,可以抽取其中连续的一段,再把这段插入到其他某个位置。我们的目标状态是把书按照 1∼n 的顺序依次排列。求最少需要多少次操作。输入格式第一行包含整数 T,表示共有 T 组测试数据。每组数据包含两行,第一行为整数 n,表示书的数量。第二行为 n 个整数,表示 1∼n 的一种任意排列。同行数之间用空格隔开。输出格式每组数据输出一个最少操作次数。如果最少操作次数大于或等于 5 次,则输出 5 or more。每个

    2022年8月8日
    8
  • C++ map 根据value找key、 根据key找value

    C++ map 根据value找key、 根据key找value根据value找key    有可能找到多个结果根据key找value    、、、、、、运行效果:代码很简单,如下:#include<iostream>#include<map>#include<string>usingnamespacestd;intmain(intargc,char*…

    2022年7月23日
    12
  • flake8 vscode_vscode报错怎么看

    flake8 vscode_vscode报错怎么看在用vscode编译python时,自带的flake8报一些不必要的错误,解决办法:{“python.linting.pylintEnabled”:false,”python.linting.enabled”:true,”python.linting.flake8Enabled”:true,”python.linting.flake8Args”:[“–max-line-length=120″,”–ignore=E4

    2025年11月7日
    6
  • 激光测距项目整体框图及原理

    激光测距项目整体框图及原理**前言:**因为前面几个星期在忙着准备一个面试,这个星期开始持续更新。。。今天的内容是相位式激光测距项目的一个整体框图及原理介绍,这部分文章链接将会加到之前的大纲中!大纲链接:目录大纲目录:1相位式激光测距原理2FFT与APFFT鉴相法1相位式激光测距原理激光测距相位法的原理这里就简单介绍一下,下面几张图片均来源于网络。这个项目主要是对激光强度进行调制的相位式激光测距(…

    2022年6月2日
    29
  • 请描述django模板中标签的作用?_html object标签

    请描述django模板中标签的作用?_html object标签常用的模板标签if标签if标签相当于Python中的if语句,有elif和else相对应,但是所有的标签都需要用标签符号({%%})进行包裹。if标签中可以使用==、!=、<、<=、&

    2022年7月30日
    8

发表回复

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

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