名词解释
数据依赖性
如果两个操作访问同一个变量,且至少有一个为写操作,那么这两个操作之间就存在数据依赖性。
as-if-serial语义
as if serial,顾名思义,就是“像序列一样”。不管编译器、处理器为了提高并行度,做了怎么样的并行重排序,线程的执行结果不能改变,需要和顺序执行的一样。
happens-before程序顺序规则
JSR-133使用happens-before的概念来阐述操作之间的内存可见性。
- 程序顺序规则:线程中每个操作,happens-before线程中任意后续操作
- 监视器锁规则:对一个锁的解锁,happens-before于随后对这个锁的加锁
- volatile变量规则:对一个volatile域的写,happens-before于任意后续对这个volatile域的读
- 传递性:A happens-before B,且B happens-before C,那么A happens-before C
两个操作之间具有happens-before关系,并不意味着前一个操作必须要在后一个操作之前执行! happens-before仅仅要求前一个操作(执行的结果)对后一个操作可见,且前一个操作按顺序排在第二个操作之前(the first is visible to and ordered before the second)
重排序
重排序简单的说就是改变指令的顺序。在计算机中,软件技术和硬件技术有一个共同的目标:在不改变程序执行结果的前提下,尽可能提高并行度,从而提高效率。编译器和处理器遵从这一目标,JMM也遵从这一目标。
为了提高性能,编译器、处理器通常会对指令做重排序,常见的有:
- 编译器优化的重排序
- 指令级并行的重排序
- 内存系统的重排序
上述1属于编译器重排序,2和3属于处理器重排序。这些重排序可能会导致多线程程序出现内存可见性问题。
个人理解,这块内容需要理解:重排序会可能会影响、改变多线程程序的执行结果。不能因为效率而丢弃正确性,所以会出现MESI、JMM等不同层面的,避免此类问题的解决方案。