volatile关键字作用

这篇具有很好参考价值的文章主要介绍了volatile关键字作用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

volatile是一个和多线程相关的关键字,主要有一下2点作用(只保证可见性,不保证原子性)

  1. 防止指令重排(有序性)
    JVM在不改变程序执行结果的前提下,在编译时会对指令的顺序进行重新排序,而volatile关键字则能够禁止指令的重新排序
  2. 能够确保线程内存中的对象对其他内存可见。(可见性)
    正常情况下每个线程操作共享变量时需要经历如下几个步骤
    volatile关键字的作用,多线程,jvm,java,开发语言
    如果某个线程(线程01)要操作主内存中的变量A,则该线程会把A变量装载到线程内部的内存中做一个副本,之后线程操作的是线程内存变量A的副本,等到操作完成再将变量的值刷新到主内存中。假设变量A=0,此时有100个线程并发的对它进行+1,理想情况,最后A的值是100.但再设计情况中我们会发现,A的值并不会是100,(假设线程01读到的A的值是0,而线程02读到的是1,但线程02把值刷回主内存,此时A=2,然后线程01执行结束将1刷回主内存,而此时主内存的值从2变成了1),我们将变量A用volatile后,线程操作变量之后,不用等到刷新回写这一步,立即就能直接将A的值刷回主内存,从而保证了变量A对其他内存的可见性。我们再次试验,会发现变量A还是不会等于100.这也就说明了volatile关键字,并不能保证原子性。单靠volatile关键字无法解决数据不一致的问题。(我们可以使用synchronized关键字,它不但能保证可见性,还能保证原子性

个人建议:在只有读或者写的操作的情况下建议使用volatile关键字修饰,这样可以提高一些并发时候的效率问题。对于一些一已经被加锁的变量则不需要加volatile关键字,因为这样无法发挥出它的优势。文章来源地址https://www.toymoban.com/news/detail-556074.html

 static volatile Integer  a=new Integer(0);
    static Integer  b=new Integer(0);

    public static void main(String[] args) {
        testHaveVolatileDemo();//使用volati修饰
        testNoVolatileDemo();//没有使用volati修饰
    }

    public static void testHaveVolatileDemo() {
        for (int i = 0; i < 100; i++) {
            Thread thread = new Thread(new thread01());
            thread.setName("thread" + i);
            thread.start();
        }
        System.out.println("A=" + a);
    }
    public static void testNoVolatileDemo() {
        for (int i = 0; i < 100; i++) {
            Thread thread = new Thread(new thread02());
            thread.setName("thread" + i);
            thread.start();
        }
        System.out.println("B=" + b);
    }


    static class thread01 implements Runnable {
        @Override
        public void run() {
            System.out.println(Thread.currentThread().getName() + "  read A =" + a);
            a++;
        }
    }

    static class thread02 implements Runnable {
        @Override
        public void run() {
            System.out.println(Thread.currentThread().getName() + "  read B =" + b);
            b++;
        }
    }

到了这里,关于volatile关键字作用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【JavaEE初阶】多线程(三)volatile wait notify关键字 单例模式

    摄影分享~~ 以上代码运行的结果可能是输入1后,t1这个线程并没有结束。而是一直在while中循环。而t2线程已经执行完了。 以上情况,就叫做 内存可见性问题 这里使用汇编来理解,大概分为两步操作: load,把内存中flag的值,读到寄存器中。 cmp,把寄存器中的值,和0进行比

    2023年04月25日
    浏览(42)
  • 【Java基础】volatile关键字

    关于作者:CSDN内容合伙人、技术专家, 从零开始做过日活千万级APP。 专注于分享各领域原创系列文章 ,擅长java后端、移动开发、人工智能等,希望大家多多支持。 我们继续总结学习Java基础知识,温故知新。 volatile 是一个Java,可以用来修饰变量,volatile也被称为轻

    2024年02月11日
    浏览(46)
  • 浅析Java中volatile关键字

            Java中的volatile用于修饰一个变量,当这个变量被多个线程共享时,这个变量的值如果发生更新,每个线程都能获取到最新的值。volatile在多线程环境下还会禁止指令重排序,确保变量的赋值操作按照代码的顺序执行。需要注意是它不能保证变量操作的

    2024年01月21日
    浏览(48)
  • Java中的volatile关键字实现原理

    在并发编程中,线程之间的可见性问题是非常重要的一项难题。Java中提供了一种解决并发可见性问题的机制,即volatile。 在本文中,我们将会讲解Java中volatile的实现原理,为什么它能够保证可见性,以及背后的实现原理涉及到的内存屏障和JVM屏障等内容。在学习

    2023年04月27日
    浏览(43)
  • Java面试题:请谈谈Java中的volatile关键字?

    在Java中,volatile是一种特殊的修饰符,用于确保多线程环境下的变量 可见性和顺序性 。当一个变量被声明为volatile时,它可以确保以下两点: 内存可见性 :当一个线程修改了一个volatile变量的值,其他线程会立即看到这个改变。这是因为volatile会禁止CPU缓存和编

    2024年04月23日
    浏览(54)
  • Keil5中写的软件延时函数不起作用现象解析_ARM_Compiler_volatile关键字

    在学习野火霸天虎F407寄存器点亮LED时,出现实验现象:LED灯不亮,野火霸天虎F407资料。 main.c代码如下: 通过分析main.c代码,导致出现上述现象的间接原因是 延时函数 没有起作用。检查延时函数的实现代码,并没有错误。这不禁使我想起《程序员的自我修养——链接、装载

    2024年02月12日
    浏览(39)
  • volatile 关键字详解

    目录 volatile volatile 关键用在什么场景下: volatile 防止编译器优化: volatile   是一个在许多编程语言中(包括C和C++)用作的标识符。它用于告诉编译器不要对带有该修饰的变量进行优化,以确保变量在特定情况下的可见性和预测性。 在C和C++中, volatile

    2024年02月11日
    浏览(43)
  • java static关键字的作用

    用来修饰成员变量,将其变为类的成员,从而实现所有对象对于该成员的共享; 静态块用法,将多个类成员放在一起初始化,使得程序更加规整,其中理解对象的初始化过程非常关键; 用来修饰成员方法,将其变为类方法,可以直接使用“类名.方法名”的方式调用,常用于

    2024年02月08日
    浏览(51)
  • [JAVAee]volatile关键字

    目录 1.volatile的特性 ①保持线程可见性 2.volatile注意事项及适用场景 ①注意事项 ②适用场景 volatile,译为\\\"易变的\\\". 对此我们就可以这样理解,对于被volatile修饰的变量的数值,是容易变化的. 在之前的线程安全文章中,我们有讲解过\\\"可见性\\\",对于线程间的这个特性可能会导致:线程

    2024年02月16日
    浏览(36)
  • 【C】volatile 关键字

    1)基本概念 const 是C语言的一个。 const 用于告诉编译器相应的变量可能会在程序的控制之外被修改,因此编译器不应该对其进行优化。 声明语法: 作用: 防止编译器优化,确保对变量的每次访问都是实际的读写操作,而不是使用缓存中的值。 用于表示可能会 被异步

    2024年01月22日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包