广告
返回顶部
首页 > 资讯 > 精选 >java高并发的volatile与Java内存模型是什么
  • 742
分享到

java高并发的volatile与Java内存模型是什么

2023-06-25 11:06:21 742人浏览 薄情痞子
摘要

这篇文章将为大家详细讲解有关java高并发的volatile与Java内存模型是什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。public class Demo09 {&

这篇文章将为大家详细讲解有关java高并发的volatile与Java内存模型是什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

public class Demo09 {    public static boolean flag = true;    public static class T1 extends Thread {        public T1(String name) {            super(name);        }        @Override        public void run() {            System.out.println("线程" + this.getName() + " in");            while (flag) {                ;            }            System.out.println("线程" + this.getName() + "停止了");        }    }    public static void main(String[] args) throws InterruptedException {        new T1("t1").start();        //休眠1秒        Thread.sleep(1000);        //将flag置为false        flag = false;    }}

运行上面代码,会发现程序无法终止。

线程t1的run()方法中有个循环,通过flag来控制循环是否结束,主线程中休眠了1秒,将flag置为false,按说此时线程t1会检测到flag为false,打印“线程t1停止了”,为何和我们期望的结果不一样呢?运行上面的代码我们可以判断,t1中看到的flag一直为true,主线程将flag置为false之后,t1线程中并没有看到,所以一直死循环。

那么t1中为什么看不到被主线程修改之后的flag?

要解释这个,我们需要先了解一下java内存模型(JMM),Java线程之间的通信由Java内存模型(本文简称为JMM)控制,JMM决定一个线程对共享变量的写入何时对另一个线程可见。从抽象的角度来看,JMM定义了线程和主内存之间的抽象关系:线程之间的共享变量存储在主内存(main memory)中,每个线程都有一个私有的本地内存(local memory),本地内存中存储了该线程以读/写共享变量的副本。本地内存是JMM的一个抽象概念,并不真实存在。它涵盖了缓存,写缓冲区,寄存器以及其他的硬件和编译器优化。Java内存模型的抽象示意图如下:

java高并发的volatile与Java内存模型是什么

从上图中可以看出,线程A需要和线程B通信,必须要经历下面2个步骤:

首先,线程A把本地内存A中更新过的共享变量刷新到主内存中去

然后,线程B到主内存中去读取线程A之前已更新过的共享变量

下面通过示意图来说明这两个步骤:

java高并发的volatile与Java内存模型是什么

如上图所示,本地内存A和B有主内存中共享变量x的副本。假设初始时,这三个内存中的x值都为0。线程A在执行时,把更新后的x值(假设值为1)临时存放在自己的本地内存A中。当线程A和线程B需要通信时,线程A首先会把自己本地内存中修改后的x值刷新到主内存中,此时主内存中的x值变为了1。随后,线程B到主内存中去读取线程A更新后的x值,此时线程B的本地内存的x值也变为了1。从整体来看,这两个步骤实质上是线程A在向线程B发送消息,而且这个通信过程必须要经过主内存。JMM通过控制主内存与每个线程的本地内存之间的交互,来为java程序员提供内存可见性保证。

对JMM了解之后,我们再看看文章开头的问题,线程t1中为何看不到被主线程修改为false的flag的值,有两种可能:

主线程修改了flag之后,未将其刷新到主内存,所以t1看不到

主线程将flag刷新到了主内存,但是t1一直读取的是自己工作内存中flag的值,没有去主内存中获取flag最新的值

对于上面2种情况,有没有什么办法可以解决?

是否有这样的方法:线程中修改了工作内存中的副本之后,立即将其刷新到主内存;工作内存中每次读取共享变量时,都去主内存中重新读取,然后拷贝到工作内存。

java帮我们提供了这样的方法,使用volatile修饰共享变量,就可以达到上面的效果,被volatile修改的变量有以下特点:

线程中读取的时候,每次读取都会去主内存中读取共享变量最新的值,然后将其复制到工作内存

线程中修改了工作内存中变量的副本,修改之后会立即刷新到主内存

我们修改一下开头的示例代码:

public volatile static boolean flag = true;

使用volatile修饰flag变量,然后运行一下程序,输出:

线程t1 in线程t1停止了

这下程序可以正常停止了。volatile解决了共享变量在多线程中可见性的问题,可见性是指一个线程对共享变量的修改,对于另一个线程来说是否是可以看到的。\

关于“java高并发的volatile与Java内存模型是什么”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

--结束END--

本文标题: java高并发的volatile与Java内存模型是什么

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

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

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

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

下载Word文档
猜你喜欢
  • java高并发的volatile与Java内存模型是什么
    这篇文章将为大家详细讲解有关java高并发的volatile与Java内存模型是什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。public class Demo09 {&...
    99+
    2023-06-25
  • java高并发的volatile与Java内存模型详解
    public class Demo09 { public static boolean flag = true; public static class T1...
    99+
    2022-11-12
  • Java内存模型volatile的内存语义是什么
    这篇文章主要介绍“Java内存模型volatile的内存语义是什么”,在日常操作中,相信很多人在Java内存模型volatile的内存语义是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java内存模型v...
    99+
    2023-06-25
  • 并发编程之Java内存模型volatile的内存语义
    1、volatile的特性 理解volatile特性的一个好办法是把对volatile变量的单个读/写,看成是使用同一个锁对单个读/写操作做了同步。 代码示例: package ...
    99+
    2022-11-12
  • Java并发编程之volatile与JMM多线程内存模型
    目录一、通过程序看现象二、为什么会产生这种现象(JMM模型)?三、MESI 缓存一致性协议 一、通过程序看现象 在开始为大家讲解Java 多线程缓存模型之前,我们先看下面的这一段代码...
    99+
    2022-11-13
  • Java并发编程中的内存模型是什么
    这篇文章主要介绍“Java并发编程中的内存模型是什么”,在日常操作中,相信很多人在Java并发编程中的内存模型是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java并发编程中的内存模型是什么”的疑惑有所...
    99+
    2023-06-25
  • Java并发编程之volatile与JMM多线程内存模型实例分析
    本篇内容主要讲解“Java并发编程之volatile与JMM多线程内存模型实例分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java并发编程之volatile与JMM多线程内存模型实例分析”...
    99+
    2023-06-30
  • Java并发中的内存模型
    这篇文章主要讲解了“Java并发中的内存模型”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java并发中的内存模型”吧!CPU和内存在讲JMM之前,我想先和大家聊聊硬件层面的东西。大家应该都...
    99+
    2023-06-02
  • Java的内存模型是什么
    这篇文章主要介绍“Java的内存模型是什么”,在日常操作中,相信很多人在Java的内存模型是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java的内存模型是什么”的疑惑有所帮助!接下来,请跟着小编一起来...
    99+
    2023-06-15
  • 怎么浅谈Java并发编程中的Java内存模型
    这篇文章的内容主要围绕怎么浅谈Java并发编程中的Java内存模型进行讲述,文章内容清晰易懂,条理清晰,非常适合新手学习,值得大家去阅读。感兴趣的朋友可以跟随小编一起阅读吧。希望大家通过这篇文章有所收获!物理计算机并发问题在介绍Java内存...
    99+
    2023-06-17
  • Java内存模型的并发处理示例
    这篇文章给大家分享的是有关Java内存模型的并发处理示例的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Java的优点是什么1. 简单,只需理解基本的概念,就可以编写适合于各种情况的应用程序;2. 面向对象;3. ...
    99+
    2023-06-14
  • 并发编程之Java内存模型锁的内存语义
    目录1、锁的释放-获取建立的happens-before关系2、锁释放和获取的内存语义3、锁内存的语义实现4、concurrent包的实现简介: 锁的作用是让临界区互斥执行。本文阐述...
    99+
    2022-11-12
  • Java内存模型的原理是什么
    这篇文章将为大家详细讲解有关Java内存模型的原理是什么,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。所有的编程语言中都有内存模型这个概念,区别于微架构的内存模型,高级语言的内存模型包括了编...
    99+
    2023-06-17
  • Java内存模型的规定是什么
    本篇内容介绍了“Java内存模型的规定是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!首先要明确内存模型指什么。书中的定义是:在特定的操...
    99+
    2023-06-02
  • Java内存模型的概念是什么
    这篇文章主要介绍了Java内存模型的概念是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Java内存模型的概念是什么文章都会有所收获,下面我们一起来看看吧。内存模型,英文名Memory Model,他是一个...
    99+
    2023-06-02
  • Java内存模型原理是什么
    这篇文章主要介绍“Java内存模型原理是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Java内存模型原理是什么”文章能帮助大家解决问题。内部原理JVM 中试图定义一种 JMM 来屏蔽各种硬件和...
    99+
    2023-06-02
  • java中内存模型的作用是什么
    java中内存模型的作用是什么?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。java基本数据类型有哪些Java的基本数据类型分为:1、整数类型,用来表示整数的数据类型。2、...
    99+
    2023-06-14
  • Java常见知识点中Jvm内存结构、Java内存模型、Java对象模型的区别是什么
    这篇文章将为大家详细讲解有关Java常见知识点中Jvm内存结构、Java内存模型、Java对象模型的区别是什么,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。我们都知道,Java代码是要运行在...
    99+
    2023-06-05
  • java并发模型中的两种锁是什么
    这篇文章主要介绍java并发模型中的两种锁是什么,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!Java可以用来干什么Java主要应用于:1. web开发;2. Android开发;3. 客户端开发;4. 网页开发;5...
    99+
    2023-06-14
  • Java内存模型的原理以及其用法是什么
    Java内存模型的原理以及其用法是什么,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。为什么要有内存模型在介绍 Java 内存模型之前,我们先来看一下到底什么是计算机内存模型...
    99+
    2023-06-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作