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