Java happens-before原则

129 阅读2分钟

基本原则

  1. 程序次序规则(Program Order Rule)

    • 在一个线程中,按照程序代码顺序,前面的操作 happens-before 后面的操作。
    • 例如,在同一个线程中,语句 A; B; 保证 A happens-before B
  2. 监视器锁定规则(Monitor Lock Rule)

    • 一个锁的解锁操作 happens-before 该锁的后续加锁操作。
    • 例如,如果线程 A 解锁了一个锁,然后线程 B 试图加锁,那么线程 A 的解锁操作 happens-before 线程 B 的加锁操作。
  3. volatile 变量规则(Volatile Variable Rule)

    • 对一个 volatile 变量的写操作 happens-before 后续对这个 volatile 变量的读操作。
    • 例如,如果线程 A 写入一个 volatile 变量,然后线程 B 读取同一个 volatile 变量,那么线程 A 的写操作 happens-before 线程 B 的读操作。
  4. 传递性(Transitivity)

    • 如果操作 A happens-before 操作 B,且操作 B happens-before 操作 C,那么操作 A happens-before 操作 C。

线程启动和终止

  1. 线程启动规则(Thread Start Rule)

    • 线程的启动操作 happens-before 启动线程中的任何操作。
    • 例如,如果线程 A 启动线程 B,那么线程 A 中启动线程 B 的操作 happens-before 线程 B 中的任何操作。
  2. 线程终止规则(Thread Termination Rule)

    • 线程中的所有操作 happens-before 其他线程检测到该线程已经终止。
    • 例如,如果线程 A 终止并且线程 B 检测到线程 A 已经终止,那么线程 A 的所有操作 happens-before 线程 B 检测到线程 A 已经终止的操作。
  3. 线程中断规则(Thread Interruption Rule)

    • 对线程的 interrupt() 调用 happens-before 被中断线程检测到中断事件的发生。
    • 例如,如果线程 A 调用线程 B 的 interrupt() 方法,那么线程 A 的 interrupt() 调用 happens-before 线程 B 检测到中断的发生(例如,通过 InterruptedExceptionisInterrupted() 方法)。

对象终结规则(Finalizer Rule)

  1. 对象终结规则(Finalizer Rule)

    • 一个对象的构造函数执行结束 happens-before 该对象的终结器(finalize 方法)的开始。
    • 例如,如果对象 A 的构造函数执行结束,那么该构造函数的结束 happens-before 对象 A 的 finalize 方法的开始。