返回顶部
首页 > 资讯 > 精选 >Java volatile关键字的特性是什么
  • 231
分享到

Java volatile关键字的特性是什么

2023-07-04 19:07:48 231人浏览 安东尼
摘要

这篇文章主要讲解了“Java volatile关键字的特性是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java volatile关键字的特性是什么”吧!一、概述v

这篇文章主要讲解了“Java volatile关键字的特性是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java volatile关键字的特性是什么”吧!

一、概述

volatile是Java中的关键字,用来修饰会被不同线程访问和修改的变量。

volatile是Java虚拟机提供的轻量级的同步机制,它有三个特性:

(1)保证可见性

(2)不保证原子性

(3)禁止指令重排

二、特性详解

volatile保证可见性

Java内存模型(JMM)定义了一组规则、规范,规定了程序中各个变量的访问方法。JMM关于同步的规定:

(1)线程解前,必须把共享变量的值刷新回主内存;

(2)线程加锁前,必须读取主内存的最新值同步到自己的工作内存;

(3)加锁解锁必须是同一把锁;

说明:由于JVM运行程序的实体是线程,创建每个线程时,JMM会为其创建一个工作内存(也称栈空间),工作内存是每个线程的私有数据区域。

Java内存模型规定所有变量都存储在主内存,主内存是共享内存区域,所有线程都可以访问。

但是线程对变量的操作(读取、赋值等)必须在工作内存中进行。因此首先要将变量从主内存拷贝到自己的工作内存,然后对变量进行操作,操作完成后再将变量写会主内存中。

举例说明:

(1)火车票卖票系统还剩下一张票,并已经刷入到主内存中:ticketNum = 1;

(2)此时有3个用户在同时购买票,3个线程都读入了目前的票数,ticketNum=1,那么线程就会继续进入购买流程。

(3)假设其中一个线程先抢占了CPU资源,先买到票,并将自己的工作内存中的ticketNum值改为0,ticketNum=0,然后再写回到主内存。

这时,由于一个线程的用户已经买到了票,那么其他用户的线程应该不能再继续进入购买票的流程了,因此需要系统通知到其他线程 ticketNum=0 这个消息。如果可以达到这样的效果,可以理解为 具有可见性。

无可见性代码演示:

@Testpublic void test1() {    DataDemo dataDemo = new DataDemo();    RunThread runThread = new RunThread(dataDemo);    runThread.start();    while (dataDemo.getNumber() == 0) {    }    System.out.println("具有可见性验证通过");}public class DataDemo {    private int number = 0;    public void add() {        this.number = this.number + 10;    }    public int getNumber() {        return number;    }}public class RunThread extends Thread {    private DataDemo dataDemo;    public RunThread(DataDemo dataDemo) {        this.dataDemo = dataDemo;    }    @Override    public void run() {        System.out.println("线程[" + Thread.currentThread().getName() + "] 正在执行");        try {            TimeUnit.SECONDS.sleep(3);        } catch (InterruptedException e) {            e.printStackTrace();        }        dataDemo.add();        System.out.println("线程[" + Thread.currentThread().getName() + "]更新后,number值为:" + dataDemo.getNumber());    }}

执行结果:
线程[Thread-0] 正在执行
线程[Thread-0]更新后,number值为:10

Java volatile关键字的特性是什么

结果分析:

可以看出子线程启动后将number值改为了10,虽然已经改为了非0,但是主线程仍然一直处于while循环中,因此此时number不具有可见性,系统不会主动通知主线程number值修改。

原理说明:

这个问题其实就是私有堆栈中的值和公共堆栈中的值不同步造成的。解决这样的问题就要使用 volatile 关键字了,它主要的作用就是当线程访问number这个变量时,强制性从公共堆栈中进行取值。

Java volatile关键字的特性是什么

可见性代码演示:

@Testpublic void test1() {    DataDemo dataDemo = new DataDemo();    RunThread runThread = new RunThread(dataDemo);    runThread.start();    while (dataDemo.getNumber() == 0) {    }    System.out.println("具有可见性验证通过");}public class DataDemo {    // 给变量 number 添加 volatile 关键字修饰    volatile private int number = 0;    public void add() {        this.number = this.number + 10;    }    public int getNumber() {        return number;    }}public class RunThread extends Thread {    private DataDemo dataDemo;    public RunThread(DataDemo dataDemo) {        this.dataDemo = dataDemo;    }    @Override    public void run() {        System.out.println("线程[" + Thread.currentThread().getName() + "] 正在执行");        try {            TimeUnit.SECONDS.sleep(3);        } catch (InterruptedException e) {            e.printStackTrace();        }        dataDemo.add();        System.out.println("线程[" + Thread.currentThread().getName() + "]更新后,number值为:" + dataDemo.getNumber());    }}

执行结果:
线程[Thread-0] 正在执行
线程[Thread-0]更新后,number值为:10
具有可见性验证通过

结果分析:

通过对变量number变量添加了volatile关键字修饰,可以看出子线程启动后将number值改为了10,随后主线程跳出了while循环,输出了“具有可见性验证通过”,说明此时number具有可见性。

原理说明:

通过使用 volatile 关键字,强制从公共内存中读取变量的值,内存结构如图:

Java volatile关键字的特性是什么

感谢各位的阅读,以上就是“Java volatile关键字的特性是什么”的内容了,经过本文的学习后,相信大家对Java volatile关键字的特性是什么这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

--结束END--

本文标题: Java volatile关键字的特性是什么

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

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

猜你喜欢
  • Java volatile关键字的特性是什么
    这篇文章主要讲解了“Java volatile关键字的特性是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java volatile关键字的特性是什么”吧!一、概述v...
    99+
    2023-07-04
  • Java volatile关键字特性讲解下篇
    目录一、概述二、特性详解一、概述 关键字volatile虽然增加了实例变量在多个线程之间的可见性,但它却不具备同步性,那么也就不具备原子性。 二、特性详解 原子性是指一个线程的操作是...
    99+
    2022-12-12
    Java volatile Java volatile关键字
  • Java Synchronize下的volatile关键字是什么
    这篇文章主要讲解了“Java Synchronize下的volatile关键字是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java Synchronize下的volatile关键字是...
    99+
    2023-06-13
  • java volatile关键字的用法是什么
    在Java中,volatile关键字用于修饰变量,用来保证多线程下的可见性和顺序性。具体来说,volatile关键字具有以下作用: ...
    99+
    2024-03-15
    java
  • Java volatile关键字特性实例代码分析
    这篇文章主要讲解了“Java volatile关键字特性实例代码分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java volatile关键字特性实例代码分析”吧!一...
    99+
    2023-07-04
  • Java中的volatile关键字有什么用
    本篇内容主要讲解“Java中的volatile关键字有什么用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java中的volatile关键字有什么用”吧!一、volatile作用可以保证多线程环...
    99+
    2023-06-30
  • java中的volatile关键字
    目录1.volatile实现可见性的原理是什么?2.演示volatile的可见性1.volatile实现可见性的原理是什么? 有volatile变量修饰的共享变量进行写操作的时候汇编...
    99+
    2024-04-02
  • Java中volatile关键字有什么用
    这篇文章将为大家详细讲解有关Java中volatile关键字有什么用,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。概述Java语言中关键字 volatile 被称作轻量级的 synchron...
    99+
    2023-06-19
  • java中volatile关键字的语法规则是什么
    在Java中,volatile关键字有以下语法规则:1. volatile关键字用于标记一个变量,表示该变量是易变的,即可能被多个线...
    99+
    2023-09-12
    java
  • c++ volatile关键字的作用是什么
    在C++中,volatile关键字的作用是告诉编译器不要对变量进行优化,即不要将变量缓存在寄存器中,应该直接从内存中读取或写入变量。...
    99+
    2023-10-28
    c++
  • Java关键字volatile详析
    目录一、可见性二、关于指令重排volatile关键字关于先说它的两个作用: 保证变量在内存中对线程的可见性禁用指令重排 每个字都认识,凑在一起就麻了 这两个作用通常很不容易被我们Ja...
    99+
    2024-04-02
  • 【Java基础】volatile关键字
    关于作者:CSDN内容合伙人、技术专家, 从零开始做过日活千万级APP。 专注于分享各领域原创系列文章 ,擅长java后端、移动开发、人工智能等,希望大家多多支持。 目录 一、导读二、概览2.1 作用2.2 多线程共享变量的访...
    99+
    2023-08-17
    java 开发语言 android 面试
  • Java中volatile关键字的作用
    目录一、volatile作用二、什么是可见性三、什么是总线锁和缓存锁四、什么是指令重排序一、volatile作用 可以保证多线程环境下共享变量的可见性通过增加内存屏障防止多个指令之间...
    99+
    2024-04-02
  • C语言volatile关键字的作用是什么
    本篇内容介绍了“C语言volatile关键字的作用是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!写在前面版本信息:Linux操作系统,...
    99+
    2023-07-06
  • volatile关键字有什么作用
    这篇文章主要讲解了“volatile关键字有什么作用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“volatile关键字有什么作用”吧!volatile关键字是一种类型修饰符,用它声明的类型...
    99+
    2023-06-17
  • java中的volatile关键字怎么使用
    本篇内容介绍了“java中的volatile关键字怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1.volatile实现可见性的原理...
    99+
    2023-06-25
  • Java中Volatile关键字能保证原子性吗
    目录volatile有序性可见性是否能够保证原子性volatile volatile 是 Java 中的一个相对来说比较重要的关键字,主要就是用来修饰会被不同线程访问和修改的变量。 ...
    99+
    2024-04-02
  • Java Synchronize下的volatile关键字详解
    简介关键词:Synchronize与volatile Synchronize:无论是对于Synchronize同步方法异或是Synchronize块,本质是对某对象或某类加锁,...
    99+
    2024-04-02
  • Java Volatile关键字如何理解
    Java Volatile关键字如何理解,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。正文在谈 Volatile 之前,我们先回顾下 Java 内存模...
    99+
    2023-06-22
  • 如何学习Java volatile关键字
    今天就跟大家聊聊有关如何学习Java volatile关键字,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。相信大多数Java程序员都学习过volatile这个关键字的用法。百度百科上...
    99+
    2023-06-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作