[Q&A] 什么是as-if-serial语义?
不管怎么重排序,单线程程序的执行结果不能被改变。编译器、runtime、处理器都必须遵守as-if-serial语义。
[Q&A] 是如何保证as-if-serial语义的?
为了遵守as-if-serial语义,编译器和处理器不会对存在数据依赖关系
的操作做重排序。但是,如果操作之间不存在数据依赖关系,这些操作就可能被编译器和处理器重排序。
double pi = 3.14; // Adouble r = 1.0; // Bdouble area = pi * r * r; // C | A和C之间存在数据依赖关系 ,不可以重排序B和C之间存在 数据依赖关系 ,不可以重排序A和B之间不存在数据依赖关系,重排序不影响结果 |
---|
[Q&A] as-if-serial的效果?
为编写单线程程序的程序员创建了一个幻觉:单线程程序是按程序的顺序来执行的。无需担心重排序
会干扰他们,也无需担心内存可见性
问题。
-----------------------------------------------------------------------------摘自 书名:Java并发编程的艺术 作者:方腾飞;魏鹏;程晓明