是否可以在同步块中重新排序语句?例如
synchronized(lock) {
statement1;
statement2;
}
其中,statement1 和 statement2 不相互依赖。处理器或编译器可以重新排序这些语句吗?
谢谢你。
是否可以在同步块中重新排序语句?例如
synchronized(lock) {
statement1;
statement2;
}
其中,statement1 和 statement2 不相互依赖。处理器或编译器可以重新排序这些语句吗?
谢谢你。
synchronized
是的,如果优化器决定,这些语句可以在块内重新排序。但他们不能被带出synchronized
。
编译器(实际上是优化器)可能会重新排序,甚至消除代码(例如分配给在超出范围之前不会被引用的变量),如果它知道肯定不会有副作用并且它会加快速度。这只会发生在同步块本身内。
根据 JSR-133,同步块内的语句不能重新排序: http ://www.cs.umd.edu/~pugh/java/memoryModel/jsr-133-faq.html ,“同步做什么”部分
“线程中的每个动作都发生在该线程中的每个动作之前,这些动作按程序的顺序稍后出现。”