Java多线程之happen-before简介

在JDK5 开始,Java使用新的JSR-133内存模型,该模型使用happens-before的概念来阐述操作之间的内存可见性。在JMM中,如果一个操作执行的结果需要对另一个操作可见,那么这两个操作之间必须要存在happens-before关系。这里提到的两个操作既可以是一个线程之内,也可以是在不同的线程之间。

与我们程序员密切相关的happens-before规则如下。

  1. 程序顺序规则:一个线程中的每个操作,happens-before于该线程中的任意后续操作。
  2. 监视器锁规则:对一个锁的解锁,happens-before于随后对这个锁的加锁。
  3. volatile变量规则:对一个volatile域的写,happens-bofore于任何后续对这个volatile域 的读。
  4. 传递性:如果A happens-before B, B happens-bofore C ,那么A happens-before C。

注意:两个操作之间具有happen-before关系,并不意味着前一个操作必须在后一个操作之前执行!happens-before仅仅要求前一个操作(执行的结果)对后一个操作可见即可,且前一个操作按顺序排在第二个操作之前。

happens-before 与 JVM的关系如图所示:

如上图所示,一个happens-before规则对应于一个或多个编译器和处理器重排序规则。对于Java程序员来说,happens-before规则简单易懂,它避免了Java程序员为了理解JMM提供了内存可见性保证而去学习复杂的重排序规则以及这些规则的具体实现方法。

猜你喜欢

转载自blog.csdn.net/IBLiplus/article/details/83749225