锁消除指的是通过逃逸分析,得知该代码块永远不会逃逸出当前线程的作用范围,无需加锁,但是加锁了,就可以通过锁消除技术来去除这种没有意义的锁。例如如下:
public class LockClearTest {
public static void main(String[] args) {
LockClearTest test = new LockClearTest();
for (int i = 0; i < 100000; i++) {
test.append("aaa", "bbb");
}
}
public void append(String str1, String str2) {
StringBuffer stringBuffer = new StringBuffer();
stringBuffer.append(str1).append(str2);
}
这个append方法中,stringBuffer是有同步的,但是append方法是作为局部变量存在,不会超出当前线程的作用范围。所以可以用StringBuilder来替代。
锁粗话指的是当需要频繁的对同一个对象进行加锁和解锁时,可以扩大锁的范围
例如
for(int i = 0; i < 100; i++){
synchronized(obj){
//doSomething
}
}
经过锁粗话后会变成
synchronized(obj){
for(int i = 0; i < 100; i++){
//doSomething
}
}