1

是否可以在同步块中重新排序语句?例如

synchronized(lock) {
   statement1;
   statement2;
}

其中,statement1 和 statement2 不相互依赖。处理器或编译器可以重新排序这些语句吗?

谢谢你。

4

3 回答 3

8

synchronized是的,如果优化器决定,这些语句可以在块内重新排序。但他们不能被带出synchronized

于 2011-07-07T18:10:29.460 回答
1

编译器(实际上是优化器)可能会重新排序,甚至消除代码(例如分配给在超出范围之前不会被引用的变量),如果它知道肯定不会有副作用并且它会加快速度。这只会发生在同步块本身内。

于 2011-07-07T18:12:30.530 回答
-1

根据 JSR-133,同步块内的语句不能重新排序: http ://www.cs.umd.edu/~pugh/java/memoryModel/jsr-133-faq.html ,“同步做什么”部分

“线程中的每个动作都发生在该线程中的每个动作之前,这些动作按程序的顺序稍后出现。”

于 2012-07-27T00:07:08.533 回答