OracleJDK7和8中的HotSpot JVM是否针对在同一对象上同步的嵌套synchronized块进行了优化?
例如,第一个代码清单(类A)和第二个代码清单(类B)一样有效吗?(类B避免了类A中出现的嵌套synchronized (x) )
public class A {
private final Object x = new Object();
public void a() {
synchronized (x) {
// code snippet 1
b();
// code snippet 2
}
}
public void b() {
synchronized (x) {
// code snippet 3
}
}
}
public class B {
private final Object x = new Object();
public void a() {
synchronized (x) {
// code snippet 1
c();
// code snippet 2
}
}
public void b() {
synchronized (x) {
c();
}
}
private void c() {
// code snippet 3
}
}发布于 2014-07-22 06:33:17
是的,JDK 7中甚至出现了一个VM选项(默认情况下是打开的):
-XX:+EliminateNestedLocks但是,它似乎只在监视器对象为static final或锁定this对象时才起作用。
发布于 2014-07-21 09:51:29
在b短到可以内联的情况下,我希望如此。否则不会,因为过程间的分析太复杂了,而且收益有限(不能内联的东西可能需要很长的时间,一些开销是可以接受的)。但是,您仍然可以从偏向锁定中获益。
这只是一个猜测,但即使是JDK6也有lock coarsening,它可以被认为是您所询问的更复杂的版本。在内联之后,我们有
public void a() {
synchronized (x) {
// code snippet 1
synchronized (x) {
// code snippet 3
}
// code snippet 2
}
}而锁的粗化开始于类似这样的东西
public void a() {
synchronized (x) {
// code snippet 1
}
synchronized (x) {
// code snippet 3
}
synchronized (x) {
// code snippet 2
}
}这是一个更复杂的情况,因为在这里加入同步块可能会降低吞吐量,而在您的情况下,绝对不会有任何损失。
https://stackoverflow.com/questions/24856486
复制相似问题