传递性(Transitivity):如果操作 A 先行发生于操作 B,操作 B 先行发生于操作 C,那就可以得出结论:操作 A 先行发生于操作 C。
Java 语言无须任何同步手段保障就能成立的先行发生规则有且只有上面这些。
“时间上的先后顺序”与“先行发生”之间有什么不同?
一个操作“时间上的先发生”不代表这个操作会是 “先行发生”。譬如:操作 A 是 ,线程 A 对未被 volatile 修饰的共享变量的写操作;操作 B 是,线程 B 对该共享变量的读操作。在时间上,操作 A 比操作 B 先发生,但是不代表操作 A 先行发生于操作 B。
如果一个操作“先行发生”,也不能推导出这个操作必定是“时间上的先发生”。譬如:程序次序规则,在一个线程内,按照控制流顺序,书写在前面的操作 A 先行发生于书写在后面的操作 B。但是,不代表在时间上,操作 A 比操作 B 先发生。普通的变量会保证在方法的执行过程中,所有依赖赋值结果的地方都能获取到正确的结果,而不能保证变量赋值操作的顺序与程序代码中的执行顺序一致。