[JAVAee]volatile关键字

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

目录

1.volatile的特性

①保持线程可见性

2.volatile注意事项及适用场景

①注意事项

②适用场景


1.volatile的特性

①保持线程可见性

volatile,译为"易变的".

对此我们就可以这样理解,对于被volatile修饰的变量的数值,是容易变化的.

在之前的线程安全文章中,我们有讲解过"可见性",对于线程间的这个特性可能会导致:线程在对主内存中的共享元素做上"无用功",即是执行了一次任务,结果却原封不动甚者造成了更错误的结果.

对于线程可见性导致的线程不安全,我们就可以采用volatile关键字,对共享元素进行修饰.从而达到我们期望的结果.

在jvm中,编译器可能会偷偷的把你写的代码进行优化.这种优化对于单线程来说,只会提高你工作的效率以达到更好的效果.但在多线程的环境下,可能就会发生我们意想不到的错误.

import java.util.Scanner;

public class Test {
    public static int n = 0;
    public static void main(String[] args) throws InterruptedException {
        Thread thread0 = new Thread(() ->{
           while(n == 0){
                //在while循环中为空,while在短时间内就会执行非常多次
               //每一次的循环,都要从表达式中拿n与0进行比较
               //因为在短时间内,执行了无数次while,同时也执行了无数次的n与0比较
               //编译器发现,n每一次都是0.于是开始优化,
               //往后的每一次读取都不会再从主内存中重新读取,而只是读取线程工作内存中的n的副本
               //线程1在更新了n变量后,线程0读取n变量的时候却已经不会再从主内存中拿取
               //这就导致n变量更新为非0后,程序也不会停止下来
           }
            System.out.println("END");
        });
        Thread thread1 = new Thread(() ->{
            Scanner scanner = new Scanner(System.in);
            n = scanner.nextInt();
        });
        thread0.start();
        thread1.start();
    }
}

输入非0数值后,代码还在不断的运行着 

[JAVAee]volatile关键字,java,开发语言

 还可以从jconsloe中观察到,线程0一直处在runnable状态下.

[JAVAee]volatile关键字,java,开发语言

而经volatile修饰后的变量,就不会发生这一情况.

每次的读取被修饰的变量,都会重新读取主内存进行拷贝.从而可能保证线程与主内存同一个变量的数值永远相同.就不会发生因可见性而引起的问题.

public static volatile int n = 0;//更改后,上面的代码能够恢复到我们预期的结果

2.volatile注意事项及适用场景

①注意事项

有重要的一点,我们要知道.volatile并不能保持原子性.

对于volatile,能做的只是保证在一个线程在工作内存中的从主内存拷贝到的共享变量的副本与主内存中的共享变量的数值一致. 

[JAVAee]volatile关键字,java,开发语言

上面的场景,就是因为没有保证原子性而导致的.

②适用场景

volatile只适用于,文章中的第一个代码.一个线程写入,一个不同的线程进行读取的场景下.

如果两个线程都要读取与写入同一个变量,还是要对其进行上锁,使用synchronized关键字文章来源地址https://www.toymoban.com/news/detail-599780.html

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

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

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

相关文章

  • 浅析Java中volatile关键字

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

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

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

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

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

    2024年04月23日
    浏览(44)
  • C语言中volatile/register/const/static/extern/auto关键字的作用

    目录 一、volatile 二、register详解 三、const详解 四、static详解 五、extern详解 语法 作用 六、auto详解 突然想总结一下这些的作用,灵活使用这些对程序的可靠性和速率都有提高 volatile是防止编译器优化,如果是高频繁的变量编译器会自动将变量放到寄存器中,但是有的变

    2024年02月07日
    浏览(55)
  • 【JavaEE】Java中复杂的Synchronized关键字

    目录  一、synchronized的特性 (1)互斥 (2)刷新内存 (3)可重入 二、synchronized的使用 (1)修饰普通方法 (2)修饰静态方法 (3)修饰代码块 三、synchronized的锁机制 (1)基本特点 (2)加锁工作过程 1.偏向锁 2.轻量级锁 3.重量级锁 (3)优化操作 1.锁消除 2.锁粗化 四、

    2024年01月19日
    浏览(35)
  • volatile关键字作用

    volatile是一个和多线程相关的,主要有一下2点作用(只保证可见性,不保证原子性) 防止指令重排(有序性) JVM在不改变程序执行结果的前提下,在编译时会对指令的顺序进行重新排序,而volatile则能够禁止指令的重新排序 能够确保线程内存中的对象对其他内存可

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

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

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

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

    2024年01月22日
    浏览(37)
  • 【多线程】volatile关键字

    一、volatile 1.volatile的底层原理是内存屏障,Memory Barrier, Memory Fence 2.对volatile变量的写指令(赋值操作)后会加入写屏障 3.对volatile变量的读指令(取变量值)前会加入读屏障 4.写屏障的作用会将写屏障之前的赋值改动操作,对共享变量的改动都同步到主内存中 5.读屏障的作

    2024年02月06日
    浏览(33)
  • volatile关键字(轻量级锁)

    目录 一、volatile出现背景 二、JMM概述 2.1、JMM的规定  三、volatile的特性 3.1、可见性  3.1.1、举例说明  3.1.2、总结 3.2、无法保证原子性 3.2.1、举例说明 3.2.2、分析 3.2.3、使用volatile对原子性测试  3.2.4、使用锁机制  3.2.5、总结 3.3、禁止指令重排序  四、volatile的内存语义 4

    2024年02月15日
    浏览(32)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包