happen-before 介绍
Happen-before 关系,是 Java 内存模型中保证多线程操作可见性的机制。
happen-before 关系保证一定 能够观测到前一个操作施加的内存影响,只有时间上的先后关系而并没有 happen-before 关系可能但并不保证 能观测前一个操作施加的内存影响。正是多种可能性导致了多线程的不确定性和复杂性,但是要分析多线程的安全性,我们只能分析确定性部分,这就要求找出 happen-before 关系。
- 线程内执行的每个操作,都保证 happen-before 后面的操作,这就保证了基本的程序顺序规则,这是开发者在书写程序时的基本约定。
- 对于 volatile 变量,对它的写操作,保证 happen-before 在随后对该变量的读取操作。
- 对于一个锁的解锁操作,保证 happen-before 加锁操作。
- 对象构建完成,保证 happen-before 于 finalizer 的开始动作。
- 甚至是类似线程内部操作的完成,保证 happen-before 其他 Thread.join() 的线程等。
- 从 JVM 运行时视角来看,JVM 内存可分为 JVM 栈、本地方法栈、PC 计数器、方法区、堆;其中前三区是线程所私有的,后两者则是所有线程共有的
- 从 JVM 内存功能视角来看,JVM 可分为堆内存、非堆内存与其他。其中堆内存对应于上述的堆区;非堆内存对应于上述的 JVM 栈、本地方法栈、PC 计数器、方法区;其他则对应于直接内存
- 从线程运行视角来看,JVM 可分为主内存与线程工作内存。Java 内存模型规定了所有的变量都存储在主内存中;每个线程的工作内存保存了被该线程使用到的变量,这些变量是主内存的副本拷贝,线程对变量的所有操作(读取、赋值等)都必须在工作内存中进行,而不能直接读写主内存中的变量
- 从垃圾回收视角来看,JVM 中的堆区=新生代+老年代。新生代主要用于存放新创建的对象与存活时长小的对象,新生代 = E+S1+S2;老年代则用于存放存活时间长的对象
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论