【Java面试】并发编程高频面试题,请你说一下你对Happens-Before的理解

“请你说一下你对Happens-Before的理解”
你听到这个问题的时候,知道怎么回答吗?
大家好,我是Mic,一个工作了14年的Java程序员。
并发编程是面试过程中重点考察的方向,能够考察的方向有很多
关于这个问题,我把高手回答整理到了15W字的面试文档里面大家可以私信我领取
下面看看高手的回答。

高手:

首先,Happens-Before是一种可见性模型,也就是说,在多线程环境下。

原本因为指令重排序的存在会导致数据的可见性问题,也就是A线程修改某个共享变量

对B线程不可见。

因此,JMM通过Happens-Before关系向开发人员提供跨越线程的内存可见性保证。

如果一个操作的执行结果对另外一个操作可见,那么这两个操作之间必然存在Happens-Before管理。

其次,Happens-Before关系只是描述结果的可见性,并不表示指令执行的先后顺序,也就是说只要不对结果产生影响,仍然允许指令的重排序。

最后,在JMM中存在很多的Happens-Before规则。

  • 程序顺序规则,一个线程中的每个操作,happens-before这个线程中的任意后续操作,可以简单认为是as-if-serial也就是不管怎么重排序,单线程的程序的执行结果不能改变
    【Java面试】并发编程高频面试题,请你说一下你对Happens-Before的理解
  • volatile变量规则,对一个volatile修饰的变量的写一定happens-before于任意后续对这个volatile变量的读操作
    【Java面试】并发编程高频面试题,请你说一下你对Happens-Before的理解
  • 线程启动规则,如果线程A执行操作ThreadB.start(),那么线程A的ThreadB.start()之前的操作happens-before线程B中的任意操作。 在这样一个场景中,t1线程启动之前对于x=10的赋值操作,t1线程启动以后读取x的值一定是10。 【Java面试】并发编程高频面试题,请你说一下你对Happens-Before的理解
  • join规则,如果线程A执行操作ThreadB.join()并成功返回,那么线程B中的任意操作happens-before于线程A从ThreadB.join()操作成功的返回。 【Java面试】并发编程高频面试题,请你说一下你对Happens-Before的理解

总结

Happens-Before模型,在多线程开发中是必须要理解和掌握的规则。

它能够指引开发者在使用多线程开发的时候避免出现内存可见性问题

因此这道面试题其实也是考察求职者的基础能力

大家记得点赞收藏加关注!!!

【Java面试】并发编程高频面试题,请你说一下你对Happens-Before的理解

版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Mic带你学架构
如果本篇文章对您有帮助,还请帮忙点个关注和赞,您的坚持是我不断创作的动力。欢迎关注「跟着Mic学架构」公众号公众号获取更多技术干货!

【Java面试】并发编程高频面试题,请你说一下你对Happens-Before的理解

Original: https://www.cnblogs.com/mic112/p/16610071.html
Author: 跟着Mic学架构
Title: 【Java面试】并发编程高频面试题,请你说一下你对Happens-Before的理解

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/619603/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • java基础点

    1.eclipse什么时候编译java类文件 2.在同一包中的类可以相互引用,无需用import语句 4.if else等语句,什么时候可以不加括号 6.++i和i++的区别 7….

    Java 2023年5月29日
    083
  • 使用查询让表格纵排变横排

    在数据库查询的操作中,常常会见到,让纵向排列的数据变成横向排,这其中涉及到的知识点有聚合函数,分组及if函数等等. 大致思路可以分为:根据题目意思,先选择合适的列名进行分组;使用聚…

    Java 2023年6月8日
    079
  • manjaro 安装后的基本配置

    第一步:设置官方镜像源 sudo pacman-mirrors -i -c China -m rank # 输入以上命令后会有弹出框,选择一个国内镜像(推荐 https://mir…

    Java 2023年6月6日
    083
  • 用redis和jpa实现缓存文章和点击量-SpringBoot(23)

    实现缓存文章 1.1 实体类 package com.intehel.demo.domain; import lombok.AllArgsConstructor; import l…

    Java 2023年6月13日
    083
  • JAVA学习过程记录(五)

    1.this this是一个关键字,全部小 this的内存图 一个对象一个this,this是一个变量,是一个引用, this保存当前对象的内存地址。指向自身,所以,严格意义上来说…

    Java 2023年6月7日
    090
  • SpringCloud Ribbon 负载均衡 通过服务器名无法连接的神坑一个

    一,问题 采取eureka集群、客户端通过Ribbon调用服务,Ribbon端报下列异常 java.net.UnknownHostException: SERVICE-HI jav…

    Java 2023年5月30日
    093
  • Vue自定义组件开发:使用v-model封装el-pagination组件

    1、前言 通过封装el-pagination组件开发自定义分页组件的类似文章网上已经有很多了,但看了一圈,总是不如意,于是决定还是自己动手搞一个。 2、背景 利用el-pagina…

    Java 2023年6月14日
    091
  • springboot devtools热启动

    热加载在pom.xml中添加devtools的maven引用,同时在plugin中添加devtools生效标志 <dependency> <groupId>…

    Java 2023年5月30日
    092
  • JavaWeb详解

    一、基本概念 1.前言 web开发: web,网页的意思 静态web html,css 提供给所有人看的数据始终不会发生变化 动态web 提供给所有人看的数据始终会发生变化,每个人…

    Java 2023年6月13日
    087
  • requirements_txt的使用与依赖管理

    生成requirments.txt pip freeze > requirements.txt 或者 pip install pipreqs pipreqs –encodi…

    Java 2023年6月5日
    0134
  • Mysql-强制改密

    MySQL V8.0.22 [mysqld] 跳过登录验证 skip-grant-tables use mysql; update user set authentication_…

    Java 2023年6月9日
    095
  • java单例的几种实现方法

    java单例的几种实现方法: 方式1: public class Something { private Something() {} private static class L…

    Java 2023年5月29日
    087
  • Java 反射机制

    基本概念 在Java 运行时环境中,对于任意一个类,能否知道这个类有哪些属性和方法?对于任意一个对象,能否调用它的任意一个方法? 答案是 肯定的。 这种动态获取类的信息以及动态调用…

    Java 2023年5月29日
    091
  • git查看添加删除远程仓库

    git查看添加删除远程仓库 查看远程仓库 git remote -v 删除远程仓库 git remote remove origin 添加远程仓库 git remote add o…

    Java 2023年6月15日
    0101
  • JVM内存管理面试常见问题全解

    一、什么是JVM 1、jvm的三个组成部分 二、类加载系统 – 1、类的加载过程 2、类加载器 三、双亲委派机制 – 1、双亲委派机制介绍 2、为什么要双亲…

    Java 2023年6月5日
    0122
  • Spring Security 案例实现和执行流程剖析

    在线演示 演示地址:http://139.196.87.48:9002/kitty 用户名:admin 密码:admin Spring Security Spring Securi…

    Java 2023年5月30日
    091
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球