happen-before 介绍

发布于 2024-07-28 12:05:02 字数 974 浏览 16 评论 0

Happen-before 关系,是 Java 内存模型中保证多线程操作可见性的机制。

happen-before 关系保证一定 能够观测到前一个操作施加的内存影响,只有时间上的先后关系而并没有 happen-before 关系可能但并不保证 能观测前一个操作施加的内存影响。正是多种可能性导致了多线程的不确定性和复杂性,但是要分析多线程的安全性,我们只能分析确定性部分,这就要求找出 happen-before 关系。

  • 线程内执行的每个操作,都保证 happen-before 后面的操作,这就保证了基本的程序顺序规则,这是开发者在书写程序时的基本约定。
  • 对于 volatile 变量,对它的写操作,保证 happen-before 在随后对该变量的读取操作。
  • 对于一个锁的解锁操作,保证 happen-before 加锁操作。
  • 对象构建完成,保证 happen-before 于 finalizer 的开始动作。
  • 甚至是类似线程内部操作的完成,保证 happen-before 其他 Thread.join() 的线程等。

  1. 从 JVM 运行时视角来看,JVM 内存可分为 JVM 栈、本地方法栈、PC 计数器、方法区、堆;其中前三区是线程所私有的,后两者则是所有线程共有的
  2. 从 JVM 内存功能视角来看,JVM 可分为堆内存、非堆内存与其他。其中堆内存对应于上述的堆区;非堆内存对应于上述的 JVM 栈、本地方法栈、PC 计数器、方法区;其他则对应于直接内存
  3. 从线程运行视角来看,JVM 可分为主内存与线程工作内存。Java 内存模型规定了所有的变量都存储在主内存中;每个线程的工作内存保存了被该线程使用到的变量,这些变量是主内存的副本拷贝,线程对变量的所有操作(读取、赋值等)都必须在工作内存中进行,而不能直接读写主内存中的变量
  4. 从垃圾回收视角来看,JVM 中的堆区=新生代+老年代。新生代主要用于存放新创建的对象与存活时长小的对象,新生代 = E+S1+S2;老年代则用于存放存活时间长的对象

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

[浮城]

暂无简介

0 文章
0 评论
22 人气
更多

推荐作者

謌踐踏愛綪

文章 0 评论 0

开始看清了

文章 0 评论 0

高速公鹿

文章 0 评论 0

alipaysp_PLnULTzf66

文章 0 评论 0

热情消退

文章 0 评论 0

白色月光

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文