什么是java锁消除呢?其实这些都是JVM帮我们做的功能,在JVM判断一个锁不会被其他线程使用,就会把锁消除来提高性能。
比如下面代码,我们知道StringBuffer的append方法上加入了synchronized关键字,所以是加了锁的,但是JVM知道这个StringBuffer是线程私有的,所以没有其他线程会访问到,所以JVM会取消锁,加快性能。
private void appendString(){
StringBuffer sb = new StringBuffer();
sb.append("a").append("b").append("c");
}
锁粗化:
下面代码在一个循环里加上synchronized,但是每次上锁和取消锁也很耗费性能,JVM会进行优化,在while前面加入synchronized关键字变成了下面的效果,这样就达到了锁粗化,提高性能。
private void lockCoarsening(){
int i = 0;
while (i<1000){
synchronized (Object.class){
// do something
i++;
}
}
}
private void lockCoarsening() {
int i = 0;
synchronized (Object.class) {
while (i < 1000) {
// do something
i++;
}
}
}
学习记录,如果有什么不正确的地方还望指正。