转载

【深入浅出-JVM】(68): happens-before

如果一个操作 happens-before(先行发生) 另一个操作,那么第一个操作执行结果对第二个操作可见,而且第一个操作的执行顺序排在第二个操作之前。

意义

解决重排序和 CPU 缓存

规则

  • 程序顺序规则
    在一个线程内部,按照代码的书写顺序执行
  • 锁定规则
    对锁 M 解锁之前的所有操作 happens - before 对锁 M 加锁之后的所有操作
  • volatile 变量规则
    对一个 volatile 变量的写操作以及这个 写操作之前的所有操作 happens-before 这个变量的读操作以及这个 读操作之后的所有操作
  • 线程启动规则
    主线程 A 执行过程中,启动子线程 B,那么线程 A 在启动子线程 B 之前,对共享变量的修改结果对线程 B 可见
  • 线程终止规则
    在主线程 A 执行过程中,子线程 B 终止,那么线程 B 在终止之前对共享变量的修改结果对线程 A 可见
  • 线程中断规则
    对线程 interrupt() 方法的调用先行发生于被中断线程代码检测到中断事件的发生,可以通过 Thread.interrupted检测是否发生中断
  • 传递规则
    a happens-before b ,b happens-before c,那么 a happens-before c
  • 对象终结规则
    构造函数的结束一定 happens-before 它的 finalize

其他规则

  • 将一个元素放入一个线程安全的队列操作 happens-before 从这个队列中取出这个元素的操作
  • 将一个元素放入一个线程安全容器的操作 happens-before 从容器中取出这个元素的操作
  • 在 countdownlatch中,倒数操作 happens-before await()操作

内存屏障

让一个 CPU 处理单元中,内存状态对其他处理单元可见的一项技术

  • 阻止没有数据依赖性的代码进行指令重排序,保证有序性
  • 强制把写缓冲区、高速缓存中的脏数据写回主内存,让缓存数据失效,保证数据的可见性
原文  http://mousycoder.com/thinking-in-jvm/68/
正文到此结束
Loading...