程序顺序规则指出:“线程中的每个操作都发生在程序顺序中后面出现的该线程中的每个操作之前”。
1.我在另一个线程中阅读到,操作是指:
2.“程序顺序”是什么意思?
通过示例进行解释会非常有帮助。 附加相关问题 假设我有以下代码:
首先,这是一个单线程应用程序,为了简化事情。编译器注意到它需要检查时间两次,并且还注意到一段代码与周围的记时行没有依赖关系,因此它看到了重新组织代码的潜力,这可能导致在实际执行期间Block1不被计时调用所包围(例如,考虑这个顺序Line1 -> Line2 -> Block1)。但是,作为程序员的我可以看到Line1,2和Block1之间的依赖关系。Line1应该紧接着Block1,在Block1完成需要有一定的时间,然后立即跟随Line2。
所以我的问题是:我是否正确地测量了块?
1.我在另一个线程中阅读到,操作是指:
- 对变量的读写
- 监视器的锁定和解锁
- 启动和加入线程
2.“程序顺序”是什么意思?
通过示例进行解释会非常有帮助。 附加相关问题 假设我有以下代码:
long tick = System.nanoTime(); //Line1: Note the time
//Block1: some code whose time I wish to measure goes here
long tock = System.nanoTime(); //Line2: Note the time
首先,这是一个单线程应用程序,为了简化事情。编译器注意到它需要检查时间两次,并且还注意到一段代码与周围的记时行没有依赖关系,因此它看到了重新组织代码的潜力,这可能导致在实际执行期间Block1不被计时调用所包围(例如,考虑这个顺序Line1 -> Line2 -> Block1)。但是,作为程序员的我可以看到Line1,2和Block1之间的依赖关系。Line1应该紧接着Block1,在Block1完成需要有一定的时间,然后立即跟随Line2。
所以我的问题是:我是否正确地测量了块?
- 如果是,那么是什么阻止编译器重新排列顺序。
- 如果不是(在经过Enno的回答后我认为这是正确的),我该怎么做才能防止它。
P.S.:我从最近在SO上提出的另一个问题中窃取了这段代码。
synchronized
块(与单线程程序顺序无关),那么由于没有任何操作对其他操作产生影响,它们可以自由地重新排序。 - Andrew Bissell