广告
返回顶部
首页 > 资讯 > 精选 >java中的volatile关键字怎么使用
  • 814
分享到

java中的volatile关键字怎么使用

2023-06-25 22:06:38 814人浏览 薄情痞子
摘要

本篇内容介绍了“java中的volatile关键字怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1.volatile实现可见性的原理

本篇内容介绍了“java中的volatile关键字怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

1.volatile实现可见性的原理是什么?

volatile变量修饰的共享变量进行写操作的时候汇编代码会多出一个Lock前缀指令。

在该指令下,多核处理器会引发两件事:

  • 将当前处理器缓存行的数据写回系统内存

  • 这个写回内存的操作会使在其他CPU里缓存了该内存地址的数据无效

这里需要简单了解CPU缓存一致性问题:多核处理器环境下,每个CPU都有自己的缓存行,缓存了内存中的数据,要维护多个CPU中缓存的数据一致性,就需要解决两个问题:

  • 一是写传播(某个CPU里的cache数据更新时,需要传播到其他CPU的cache中);

  • 二是事务的串行化执行(在某个CPU里对数据的修改,在其他CPU中看起来顺序是一样的,也就是要引入近似[]的概念,保证同一时刻只有一个CPU可以对数据做修改);

写传播是通过[总线嗅探]完成的:通过总线把修改数据的事件广播通知给其他所有的核心,每个CPU核心都会监听总线上的广播事件,并检查是否有相同的数据在自己的Cache里面;而事务的串行化则通过[MESI协议]来完成。

MESI(Modified(已修改)、Exclusive(独占)、Shared(共享)、Ivalidated(已失效))协议中,如果要修改一个共享数据,不能直接修改,要先向其他CPU广播一个请求,把其他CPU cache中对应的数据状态改为Invalidated;以后其他CPU在读取标记为Invalidated的数据时,需要强制从内存中读取数据。

java中的volatile关键字怎么使用

2.演示volatile的可见性

public class VolatileDemo {    static  int flag = 1;  // 定义一个共享变量    public static void main(String[] args) {        // 两个线程,一个线程负责读取flag的值,另一个线程负责修改flag的值        new Thread(){            int localflag = flag;            @Override            public void run() {                while(true){                    //flag被修改后就跟localflag不一样了                    if(localflag!=flag){                        System.out.println("读到了flag修改后的值:"+ flag);                        //把读到的值赋值给本地变量                        localflag = flag;                    }                }            }        }.start();        new Thread(){            int localflag = flag;            @Override            public void run() {                while (true){                    //一直对flag的值进行修改                    System.out.println("对flag的值进行修改:"+ ++localflag);                    flag = localflag;                    //休眠一秒更好地观察结果                    try {                        Thread.sleep(1000);                    } catch (InterruptedException e) {                        e.printStackTrace();                    }                }            }        }.start();    }}

java中的volatile关键字怎么使用

可以看到另一个线程并不能及时读取到被修改的值。

共享变量用volatile修饰后:

public class VolatileDemo {    static  volatile int flag = 1;    public static void main(String[] args) {        // 两个线程,一个线程负责读取flag的值,另一个线程负责修改flag的值        new Thread(){            int localflag = flag;            @Override            public void run() {                while(true){                    //flag被修改后就跟localflag不一样了                    if(localflag!=flag){                        System.out.println("读到了flag修改后的值:"+ flag);                        //把读到的值赋值给本地变量                        localflag = flag;                    }                }            }        }.start();        new Thread(){            int localflag = flag;            @Override            public void run() {                while (true){                    //一直对flag的值进行修改                    System.out.println("对flag的值进行修改:"+ ++localflag);                    flag = localflag;                    //休眠一秒更好地观察结果                    try {                        Thread.sleep(1000);                    } catch (InterruptedException e) {                        e.printStackTrace();                    }                }            }        }.start();    }}

java中的volatile关键字怎么使用

可以看到用volatile修饰后,每次另一个线程总能读取到修改后的值。

“java中的volatile关键字怎么使用”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

--结束END--

本文标题: java中的volatile关键字怎么使用

本文链接: https://www.lsjlt.com/news/306398.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • java中的volatile关键字怎么使用
    本篇内容介绍了“java中的volatile关键字怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1.volatile实现可见性的原理...
    99+
    2023-06-25
  • java中的volatile关键字
    目录1.volatile实现可见性的原理是什么?2.演示volatile的可见性1.volatile实现可见性的原理是什么? 有volatile变量修饰的共享变量进行写操作的时候汇编...
    99+
    2022-11-12
  • Java中volatile关键字的作用
    目录一、volatile作用二、什么是可见性三、什么是总线锁和缓存锁四、什么是指令重排序一、volatile作用 可以保证多线程环境下共享变量的可见性通过增加内存屏障防止多个指令之间...
    99+
    2022-11-13
  • Java中volatile关键字有什么用
    这篇文章将为大家详细讲解有关Java中volatile关键字有什么用,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。概述Java语言中关键字 volatile 被称作轻量级的 synchron...
    99+
    2023-06-19
  • Java中的volatile关键字有什么用
    本篇内容主要讲解“Java中的volatile关键字有什么用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java中的volatile关键字有什么用”吧!一、volatile作用可以保证多线程环...
    99+
    2023-06-30
  • Java中JMM和volatile关键字如何使用
    Java中JMM和volatile关键字如何使用,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。Java内存模型随着计算机的CPU的飞速发展,CPU的运算能力已经...
    99+
    2023-06-19
  • c++中的volatile和variant关键字怎么用
    这篇文章主要讲解了“c++中的volatile和variant关键字怎么用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“c++中的volatile和variant关键字怎么用”吧!一、两个长...
    99+
    2023-06-29
  • C语言中volatile关键字怎么用
    这篇文章主要介绍了C语言中volatile关键字怎么用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一.前言编译器优化介绍:由于内存访问速度远不及CPU处理速度,为提高机器整...
    99+
    2023-06-20
  • Volatile关键字的作用
    Volatile关键字的作用主要有如下两个: 1.线程的可见性:当一个线程修改一个共享变量时,另外一个线程能读到这个修改的值。 2. 顺序一致性:禁止指令重排序。 一、线程可见性 我们先通过一个例子来看看线程的可见性: public cla...
    99+
    2023-08-20
    volatile 并发
  • Java中static和volatile关键字的区别
    1. 作用范围不同 static关键字:用于创建类级别的变量或方法,所有类的实例共享同一个static变量的副本。 volatile关键字:用于确保一个变量在多线程环境中的可见性,使所有线程都能看到最新的变量值。 2....
    99+
    2023-10-29
    关键字 区别 Java
  • Java中JMM与volatile关键字的学习
    目录JMMvolatile关键字可见性与原子性测试哪些地方用到过volatile?单例模式的安全问题你知道CAS吗?CAS底层原理CAS缺点ABA问题总结JMM JMM是指Java内...
    99+
    2022-11-12
  • Java中volatile关键字实现原理
    前言我们知道volatile关键字的作用是保证变量在多线程之间的可见性,它是java.util.concurrent包的核心,没有volatile就没有这么多的并发类给我们使用。本文详细解读一下volatile关键字如何保证变量在多线程之间...
    99+
    2023-05-31
    java volatile 关键字
  • Java volatile关键字的特性是什么
    这篇文章主要讲解了“Java volatile关键字的特性是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java volatile关键字的特性是什么”吧!一、概述v...
    99+
    2023-07-04
  • Java Synchronize下的volatile关键字是什么
    这篇文章主要讲解了“Java Synchronize下的volatile关键字是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java Synchronize下的volatile关键字是...
    99+
    2023-06-13
  • Java 关键字 volatile 的理解与正确使用
    概述Java语言中关键字 volatile 被称作轻量级的 synchronized,与synchronized相比,volatile编码相对简单且运行的时的开销较少,但能够正确合理的应用好 volatile 并不是那么的容易,因为它比使用...
    99+
    2023-05-31
    java volatile ava
  • Java Synchronize下的volatile关键字详解
    简介关键词:Synchronize与volatile Synchronize:无论是对于Synchronize同步方法异或是Synchronize块,本质是对某对象或某类加锁,...
    99+
    2022-11-11
  • 多方面解读Java中的volatile关键字
    目录介绍作用保证变量的可见性:禁止指令重排:不能保证原子性可见性、有序性、原子性不会导致线程阻塞使用场景实现原理happens-before局限性和 synchronized 关键字...
    99+
    2023-05-19
    Java volatile volatile作用 volatile关键字
  • volatile关键字有什么作用
    这篇文章主要讲解了“volatile关键字有什么作用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“volatile关键字有什么作用”吧!volatile关键字是一种类型修饰符,用它声明的类型...
    99+
    2023-06-17
  • java中volatile关键字的语法规则是什么
    在Java中,volatile关键字有以下语法规则:1. volatile关键字用于标记一个变量,表示该变量是易变的,即可能被多个线...
    99+
    2023-09-12
    java
  • java中volatile关键字的作用与实例代码
    一,什么是volatile关键字,作用是什么  volatile是java虚拟机提供的轻量级同步机制 ​ 作用是: 1.保证可见性 2.禁止指令重排 3.不保...
    99+
    2022-11-12
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作