锁消除
JIT编译器在编译的时候,进行逃逸分析。分析synchronized锁对象是不是只可能被一个线程加锁,不存在其他线程来竞争加锁的情况。这时就可以消除该锁了,提升执行效率。
编译就不用加入monitorenter和monitorexit指令。
public static void main(String[] args) {
int size = 10000;
List<String> list = new ArrayList();
for (int i = 0; i < size; i++) {
list.add(appendStr("hi", i));
}
}
public static String appendStr(String str, int i) {
StringBuffer sb= new StringBuffer();
sb.append(str);
sb.append(i);
return sb.toString();
}
StringBuffer的append为同步方法。但上述的appendStr中的sb对象没有传递到方法外,不会被其他线程引用,不存在锁竞争的情况,因此可以进行锁消除。