happens-before 简介、final 域的内存语义

happens-before 简介

  • happens-before 是用来指定两个操作之间的执行顺序,提供线程之间的可见性,例如 A happens-before B 那么表示A的操作对B是可见的,而不是 A 先于 B 执行。
  • 在java 内存模型中,如果一个操作结果需要对另一个操作可见,那么这两个操作之间必然存在happens-before
  • happens-before 规则如下:        
  1. 程序顺序规则:单个线程中的每个操作,总是前一个操作happens-before于该线程中的任意后续操作。
  2. 监视器锁规则:对一个锁的解锁,happens-before于随后对这个锁的加锁,如果对于一个锁解锁后,再加锁,那么加锁的动作必须在解锁动作之后(同一个锁)。
  3. volatile变量规则:volatile规则 volatile变量的写,先发生于读,这保证了volatile变量的可见性,简单的理解就是,volatile变量在每次被线程访问时,都强迫从主内存中读该变量的值,而当该变量发生变化时,又会强迫将最新的值刷新到主内存,任何时刻,不同的线程总是能够看到该变量的最新值。
  4. 传递性:如果A happens-before B,且B happens-before C,那么A happens-before C
  5. start规则:如果线程A执行操作ThreadB.start()(启动线程B),那么A线程的ThreadB.start()操作happens-before于线程B中的任意操作
  6. join规则:如果线程A执行操作ThreadB.join()并成功返回,那么线程B中的任意操作happens-before于线程A从ThreadB.join()操作成功返回。

 

final 域的内存语义

  • 读final域的重排序规则 :在一个线程中,初次读对象引用和初次读该对象所包含的final域,java内存模型禁止处理器重排序这两个操作
  • 写final域的重排序规则禁止把final域的写 重排序岛构造方法之外

happens-before 简介、final 域的内存语义