3:Informal Semantics
当代码被重排序的时候,一个程序必须被正确的同步来避免多种类型的违反直觉的行为发生。使用正确的同步不能保证程序里上述的行为是正确的。但是,使用它允许一个程序员以一种简单的途径来推理出一个程序的可能行为;一个正确同步的程序的行为是极少依赖可能的重排序的。没有正确的同步,非常奇怪的、令人迷惑的和匪夷所思的行为就可能会出现。
有两个关键的办法来理解一个程序是否正确同步了:
1:Conflicting Accesses (访问冲突)
两个访问(读取或者写入)同一个共享字段或者数组元素,如果其中至少有一个访问时写入那么就被称为冲突Conficting。
2:Happens-Before Relationship
两个行为可以通过happens-before关系进行排序。如果一个行为happens-before另一个行为,那么第一个操作是可见的并且顺序先于第二个操作。应该被强调的事,一个两个行为之间的happens-before关系,并不意味着这些行为在java平台的实现中一定按照这样的顺序发生。happens-before关系通常强调的是两个互相冲突的行为之间的顺序,并且定义设么时候数据竞争将会发生。有一下一些途径来引入happens-before排序,包括:
* 一个线程中的每一个行为happens-before 当前线程中的后续一切操作
* 一个monitor上的解锁操作happens-before 同一个monitor上的后续一切锁定操作
* 一个volatile类型的field的写操作happens-before 这个volatile类型的field的任何后续读操作
时间: 2024-10-12 05:58:10