JUC并发编程第六篇,带你了解Java内存模型JMM

news2024/11/26 12:43:49

JUC并发编程第六篇,带你了解Java内存模型JMM

    • 一、Java Memory Model(Java内存模型)是什么?
    • 二、JMM规范三大特性
      • 1. 可见性
      • 2. 原子性
      • 3. 有序性
    • 三、JMM规范下多线程对变量的读写过程
    • 四、JMM规范下多线程先行发生原则(happens-before)

一、Java Memory Model(Java内存模型)是什么?

  • Java内存模型,简称JMM,是一种抽象的概念,用于描述一组规范约定,这个规范定义了程序中各个变量的读写访问方式,以及一个线程对共享变量的写入和对另一个线程的可见。

他能干嘛?

  • 1.通过JMM来实现线程和主内存之间的抽象关系。
  • 2.屏蔽各个硬件平台和操作系统的内存访问差异以实现让Java程序在各种平台下都能达到一致的内存访问效果。

技术要点

  • JMM主要关注多线程的 原子性、可见性 和 有序性。

二、JMM规范三大特性

1. 可见性

  • 指当一个线程修改了某一个共享变量的值,其他线程是否能够立即知道该变更
    在这里插入图片描述
  • JMM规定了所有的变量都存储在主内存中。
  • Java中普通的共享变量不保证可见性,因为数据修改被写入内存的时机是不确定的,多线程并发下很可能出现"脏读",所以每个线程都有自己的工作内存,线程在自己的工作内存中保存了该线程使用到的变量的主内存副本拷贝,线程对变量的所有操作都必需在线程自己的工作内存中进行,而不能够直接读写主内存中的变量。
  • 不同线程之间也无法直接访问对方工作内存中的变量,线程间变量值的传递均需要通过主内存来完成。

2. 原子性

  • 指一个操作是不可中断的,即多线程环境下,操作不能被其他线程干扰。

3. 有序性

  • 对于一个线程的执行并不总是从上到下有序执行的。
  • 为了提供性能,编译器和处理器通常会对指令序列进行重新排序。
  • 指令重排可以保证串行语义一致,但没有义务保证多线程间的语义也一致。
    在这里插入图片描述
  • 处理器在进行重排序时必须要考虑指令之间的数据依赖性

单线程环境可确保程序最终执行结果和代码顺序执行的结果一致。
多线程环境中线程交替执行,结果无法确定。

三、JMM规范下多线程对变量的读写过程

  • 我们定义的所有共享变量都储存在物理主内存中;
  • 每个线程都有自己独立的工作内存,里面保存该线程使用到的变量的副本(主内存中该变量的一份拷贝);
  • 线程对共享变量操作时,必须先在线程自己的工作内存中进行,然后写回主内存,不能直接在主内存中读写;
  • 不同线程之间也无法直接访问其他线程的工作内存中的变量,线程间变量值的传递需要通过主内存来进行。
    在这里插入图片描述

四、JMM规范下多线程先行发生原则(happens-before)

  • 在JMM中,如果一个操作执行的结果需要对另一个操作可见 或者 代码重排序,那么这两个操作之间必须存在happens-before关系。
  • Happens-Before 原则是判断数据是否存在竞争,线程是否安全的非常有用的手段。

Happens-Before规则

    1. 次序规则:

一个线程内,按照代码顺序,写在前面的操作先行发生于写在后面的操作。

    1. 锁定规则:

一个unLock操作先行发生于后面对同一个锁的lock操作。(对于同一把锁,A线程需要先释放锁,B线程才能获得锁)

    1. volatile变量规则:

对一个 volatile 变量的写操作先行发生于后面对这个变量的读操作,前面的写对后面的读是可见的。

    1. 传递规则:

操作A先行发生于操作B,而操作B又先行发生于操作C,则可以得出操作A先行发生于操作C。

    1. 线程启动规则:

Thread对象的start()方法先行发生于此线程的每一个动作。

    1. 线程中断规则:

对线程 interrupt() 方法的调用先行发生于被中断线程的代码检测到中断事件的发生(我先中断了你才能检测到)

    1. 线程终止规则:

线程中的所有操作都先行发生于对此线程的终止检测。(终止检测肯定在最后)

    1. 对象终结规则:

一个对象的初始化完成先行发生于它的 finalize() 方法的开始。(还没初始化完成,怎么可能就回收)

  • 总之:如果一个操作happens-before另一个操作,那么第一个操作的执行结果将对第二个操作可见,而且第一个操作的执行顺序排在第二个操作之前。
  • 两个操作之间存在happens-before关系,并不意味着一定要按照happens-before原则制定的顺序来执行。如果重排序之后的执行结果与按照happens-before关系来执行的结果一致,那么这种重排序并不非法。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/52000.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Oracle面试题整理

目录 Oracle面试题整理 1.MySQL和Oracle的区别: 2.Oracle中function和procedure的区别? 3. 比较truncate和delete命令 ? 4.oralce中 rowid, rownum的定义 5. 事务的特性(ACID)是指什么 6. 列举几种表连接方式…

[附源码]计算机毕业设计springboot天狗电子商城系统

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

plink2.0和plink1.9的忧伤笔记

虽然plink2.0已经存在好久了,但是一直用的都是plink1.9,因为语法熟悉。更主要是plink2.0语法变动太大,害怕步子迈得太大了…… 今天看一下plink2.0的读入和输出数据常用参数, plink2.0用是不会用的,2022年都不会用&am…

计算机网络基础

前言 计算机网络学习的核心内容就是网络协议的学习。网络协议是为计算机网络中进行数据交换而建立的规则、标准或者说是约定的集合。因为不同用户的数据终端可能采取的字符集是不同的,两者需要进行通信,必须要在一定的标准上进行。一个很形象地比喻就是…

平时健身买什么耳机好、分享五款最好的运动耳机推荐

不少人喜欢在健身房或者户外运动中使用手机或者MP3来听音乐,这种方式不仅可以减少运动中的枯燥感,而且那些节奏较强的音乐还能够进一步激发人们的运动潜能,达到事半功倍的效果。作为音乐传递的桥梁,一款佩戴舒适的运动耳机是必不可…

又撸了一个开源项目!!!

花了两周左右,写了一个客户关系管理系统,基于 Vue Go 实现,主要功能有仪表盘、客户管理、合同管理、产品管理,订阅等功能。 前几天已经在 Github 上开源了,今天也把项目部署到云服务器上了,很完美&#x…

负载均衡组件Ribbon核心-@LoadBalanced-上

引言 书接上篇 微服务负载均衡小能手-Ribbon 使用RIbion实现负载均衡远程调用 Bean LoadBalanced public RestTemplate restTemplate(){return new RestTemplate(); } 都知道没有LoadBalanced注解前,RestTemplate就是一个简单的http请求工具类,贴上该…

AI-多模态-2021:DALL-E模型【文本生成图像工具】【OpenAI】

Dall-e:从拟物文字到图片的创造 人类不断地从五种感官接收和整合信息,通过视觉、听觉、触觉、嗅觉和味觉等生物信息来理解文字和图片。然而文字和图片属于符号,Dall-e模型在理解符号的含义时并不能通过生物信息的传递。通过将对自然语言的理…

Ambari-yarn-timeline 内置 HBase数据表清理

HDP 集群 timeline 内置的 HBase 数据表持续增大,我们将默认TTL30改 为7 天。 ambari界面YARN 服务中 的 timeline v2.0 timeline 内置 HBase数据HDFS路径 : 表在HDFS上的大小 使用如下命令进入 Hbase shell [hdfswinner-backup-hdp root]$ hbase -…

网站变灰代码如何让网页变灰

1.网站变灰代码应用场景 一般在清明节,全国哀悼日,大地震的日子,以及一些影响力很大的伟人逝世或纪念日的时候,身为站长的我们都会让自己的网站的全部网页变成灰色(黑白色),以表示我们对逝者的…

数据分析之人力资源管理驾驶舱

驾驶舱是数据分析报表中用于展示关键分析指标和综合展示数据情况的,因此需要展示的内容多,需要做的内容甄选也多。 一 前言 人力资源作为企业的关键生产力,是一个企业成长发展的根本。随着“知识经济”时代的到来、市场竞争的加剧&#xff…

Shiro-全面详解(学习总结---从入门到深化)

Shiro介绍_Shiro简介 Shiro是apache旗下的一个开源安全框架,它可以帮助我们完成身 份认证,授权、加密、会话管理等功能。它有如下特点: 1、易于理解的API 简单的身份认证,支持多种数据源 2、简单的授权和鉴权 3、简单的加密API 4、…

《机器学习实战》11.Apriori算法进行关联分析

目录 使用Apriori算法进行关联分析 1 关联分析 2 Apriori原理 3 使用Apriori算法来发现频繁集 3.1 生成候选项集 3.2 组织完整的Apriori算法 4 从频繁项集中挖掘关联规则 5 示例:发现国会投票中的模式 6 示例:发现毒蘑菇的相似特征 7 本章小结…

线上服务Java进程假死快速排查、分析

线上服务Java进程假死快速排查、分析 最近我们有一台服务器上的Java进程总是在运行个两三天后就无法响应请求了,具体现象如下: 请求业务返回状态码502,查看进程还在,意味着Java进程假死,无法响应请求了;该…

React18 基础入门API、JSX语法糖

文章目录一、react的一次使用react.development.jsreact-dom.development.jsReact.createElement()二、三个APIReact.createElement()ReactDOM.createRoot()root.render() 渲染页面三、JSX(JavaScript Syntax Extension)、babelbabelJSX使用注意事项一、…

mysql与磁盘的关系

1.如今一直在说mysql存储方式和磁盘的关系,但是现在都是硬盘存储啊 磁盘分为硬盘和软盘 硬盘结构(机械硬盘和固态硬盘)详解 硬盘的大小是使用"磁头数 x 柱面数 x 扇区数 x 每个扇区的大小 如下: 每个扇区的大小是固定的…

javaEE高阶---Spring MVC

一 : 什么是Spring MVC ? 1.1 概述 Spring MVC全称Spring Web MVC,又称为Spring Web,它是一个原始的基于Servlet API 的 web 框架.Q : 经典问题 : Spring/Spring Boot/Spring MVC 有什么区别 ? A : Spring,一般指代的是Spring Framework,它是一个开源…

业务数据分析-常见业务指标

目录 1、什么是指标? 2、以互联网电商数据为例分析常用的指标 3、如何选择指标 4、电商指标体系详细介绍 1、什么是指标? 我们说过分析的最终目的就是为了通过客观的数据去发现公司业务存在的问题,那怎么通过什么数据呢?业务…

连接MySQL问题的错题小集

目录 一. 连接不上数据库 踩坑 解决过程 二. Can‘t connect to MySQL server on ‘localhost:3306‘ (10061) 排查1:数据库没有启动 排查2:判断数据库是否存在 排查3:数据库没有启动 ​编辑 过程: 报错了,排…

12.Java 技术栈中间件优雅停机方案设计与实现全景图

Java 技术栈中间件优雅停机方案设计与实现全景图 本系列 Netty 源码解析文章基于 4.1.56.Final 版本 本文概要 在上篇文章 中笔者为大家详细介绍了 Netty 在处理连接关闭时的完整过程,并详细介绍了 Netty 如何应对 TCP 连接在关闭时会遇到的各种场景。 在连接关闭…