简单聊一下:Happens-before relationship

1. 语义

  • Happens-before 关系是对在一个线程内执行的操作在另一个线程内的操作的可见性保证
  • Happens-before relationship is a guarantee that action performed by one thread is visible to another action in different thread.

2.影响

  • Happens-before 定义程序中所有操作的偏序关系。为了保证操作 Y 的执行线程能观察到操作 X 的结果(不管 X 和 Y 是否发生在不同的线程内),就必须在 X 和 Y 之间存在 Happens-before 关系。如果在两个操作之间缺少 happens-before 顺序,那么 JVM 会任意地对操作进行重排序(JIT 编译优化)
  • Happens-before 不仅仅是在时序上对操作进行重排序,它也是对内存读写顺序的保证。两个线程执行内存的读写操作可以在时间上对相互间的操作保持一致,但是可能不能一致地观察到彼此的改变(内存一致性错误),除非它们之间存在 happens-before 关系
简单聊一下:Happens-before relationship_第1张图片
Happens-before relationship.png

3.详解

  • 单线程法则(Single thread rule):线程中的每个动作A都happends-before于该线程中的每一个动作B,其中,在程序中,所有的动作B都出现在动作A之后;
  • 监视器锁法则(Monitor lock rule):unlock 必须发生在 lock 之后;
  • 传递性(Transitivity):如果A先于B, 且B 先于C, 则A肯定先于C;
  • volatile变量法则(Volatile variable rule):对volatile域的写操作先于每一个后续对同一域的读操作;
  • 线程启动法则(Thread start rule):在一个线程里,对Thread.start()的调用会先于Thread.run();
  • 线程加入法则(Thread join rule):线程中的任何动作都先于其他线程检测到这个线程已经终结,或者从Thread.join 调用中成功返回,或者Thread.isAlive返回false;
  • 中断法则: 当一个线程在另一个线程上调用 interrupt 时,必须在中断线程检测到 interrupt 调用之前执行(通过抛出 InterruptedException,或者调用 isInterrupted 和 interrupted);
  • 终结法则:对象的构造函数必须在启动该对象的终结期之前执行完成;

4.参考链接

  • https://www.logicbig.com/tutorials/core-java-tutorial/java-multi-threading/happens-before.html

你可能感兴趣的:(简单聊一下:Happens-before relationship)