当前位置: 首页 > news >正文

02-请解释一下Java的内存模型和happens-before规则?【Java面试题总结】

请解释一下Java的内存模型和happens-before规则?

概念:Java内存模型,简称JMM,是一种定义了多线程程序中内存访问行为的规范。它定义了线程如何与主内存和工作内存进行交互,以及如何保证多线程程序的正确性和可见性。Java内存模型为并发编程提供了一致性和可靠性的保证

特点

  • 主内存:所有线程共享的内存区域,包含了所有的变量和对象。对于多个线程来说,主内存是可见的。
  • 工作内存:每个线程都有自己的工作内存,工作内存是线程私有的,用于存储变量的副本。线程只能直接访问自己的工作内存,而不能直接访问其他线程的工作内存。
  • 内存间的交互:线程之间通过读写主内存中的变量来实现数据的共享和通信。当线程将变量从主内存复制到工作内存时,线程可以对其进行操作。然后,线程再将更新后的结果刷新回主内存,使得其他线程可见。

Java内存模型中的happens-before规则

happens-before规则定义了对内存操作的顺序性,它确保了多线程程序中的操作按照一定的顺序进行,保证了可靠的数据共享和通信。

  • 程序顺序规则(Program Order Rule):按照程序的顺序执行;

  • 锁定规则(Lock Rule):对于同一把锁来说,解锁(unlock)操作必然发生在后续的同一个锁的加锁(lock)之前,也就是要先解锁才能再加锁;

  • volatile变量规则(Volatile Variable Rule):volatile变量的写,先发生于读,这保证了volatile变量的可见性。简单理解就是,volatile变量在每次被线程访问时,都强迫从主内存中读该变量的值,而当该变量发生变化时,又会强迫将最新的值刷新到主内存,任何时刻,不同的线程总是能够看到该变量的最新值;

  • 传递性(Transitivity):A先于B,B先于C,那么A必然先于C;

  • 线程启动规则(Thread Start Rule):线程的 start() 方法先于它的每一个动作(线程的启动操作 happens-before 于该线程的任何操作)

    具体的说,假设线程 A 调用了线程 B 的 start() 方法来启动线程B。根据线程启动规则,线程 A 中在启动线程 B 之后的任何操作都 happens-before 于线程 B 中的任何操作

image-20230828205107569

主线程(线程A)首先将变量 flag 设置为 true,然后启动了一个新线程(线程B),根据线程启动规则,只有在启动线程之后才能执行线程的其他操作,在启动线程B后,才执行线程B中的输出操作。

  • 线程终止原则:线程的所有操作先于线程的终结,Thread.join() 方法的作用是等待当前执行的线程终止。假设在线程B终止之前,修改了共享变量,线程A从线程B的join方法成功返回,线程B对共享变量的修改将对线程A可见。
  • 线程中断规则:对线程 interrupt() 方法的调用先行发生于被中断线程的代码检查到中断事件的发生,可以通过 Thread.interrupted() 方法检测线程十分中断。
  • 对象终结规则:一个对象的初始化完成(构造函数执行结束)happens-before于它的 finalize() 方法的开始。这个规则确保了对象的正确回收和资源释放。
http://www.lryc.cn/news/152418.html

相关文章:

  • PVE 8 出现CPU 100% 冻结(卡死)
  • 【高效编程技巧】编程菜鸟和编程大佬的差距究竟在哪里?
  • 继承【C++】
  • ORB-SLAM3复现过程中遇到的问题及解决办法
  • vue开发桌面exe应用
  • C# 实现PictureBox从随机选择的文件夹内对图像进行随机播放
  • 腾讯云国际代充-GPU服务器安装驱动教程NVIDIA Tesla
  • 【python爬虫】9.带着小饼干登录(cookies)
  • 原神剑冢三层封印怎么解开 原神剑冢三层封印在哪里打
  • Papers with Semi-supervised Learning for Medical Image Segmentation(SSL4MIS)
  • c#继承(new base)的使用
  • 【办公自动化】使用Python批量处理Excel文件并转为csv文件
  • 手机怎么剪视频?分享一些剪辑工具和注意事项
  • 面试题汇总
  • LLVM系列:1.设计思想和LLVM IR简介
  • mysql中间件Atlas
  • ChatGPT 实现动态地图可视化展示
  • Vue.js安装步骤和注意事项
  • IDEA中Run/Debug Configurations添加VM options和Program arguments
  • 信息技术03--初/高中--简答题(73道知识简答)
  • Matlab之统计一维数组直方图 bin 计数函数histcounts
  • TDengine函数大全-时间和日期函数
  • 算法笔记——路径问题
  • Arcface部署应用实战
  • MySQL InnoDB 是怎么使用 B+ 树存数据的?
  • 手撕红黑树
  • 举例说明自然语言处理(NLP)技术
  • 淘宝详情API接口在各种应用中的作用性
  • java用正则方法验证文件名是否合法
  • 【learnopengl】Assimp构建与编译