鎖消除是指虛擬機即時編譯器再運行時,對一些代碼上要求同步,但是被檢測到不可能存在共享數(shù)據(jù)競爭的鎖進行消除。
如果一段代碼中,堆上的數(shù)據(jù)都不會逃逸出去從而被其他線程訪問到,那就可以把它們當作棧上的數(shù)據(jù)對待,認為它們是線程私有的,同步加鎖自然也就無需進行。
public String concatString(String s1, String s2, String s3) {
return s1 + s2 + s3;
}
上面的代碼怎么看都跟同步?jīng)]什么關(guān)系,但是由于String是一個不可變的類,對字符串的連接操作總是生成新的String對象來進行的,因此這里就存在優(yōu)化的點。再JDK1.5之前,會轉(zhuǎn)化成StringBuffer對象的連續(xù)append()操作,再JDK1.5及其以后的版本,會轉(zhuǎn)化為StringBuilder對象的連續(xù)append()操作,即:
public String cancatString(String s1, String s2, String s3){
StringBuffer sb = new StringBuffer();
sb.append(s1);
sb.append(s2);
sb.append(s3);
return sb.toString();
}
從這面就可以知道在實際的操作中是有牽涉到同步的,因為StringBuffer.append()方法中都有一個同步塊,鎖的對象就是sb。虛擬機觀察sb,很快就會發(fā)現(xiàn)它的動態(tài)作用域被限制在concatString()方法內(nèi)部。因此這里雖然有鎖,但是可以被安全的消除掉,在即時編譯之后,這段代碼會忽略掉所有的同步而直接執(zhí)行了。