如果對同一個鎖不停請求同步和釋放,其本身會消耗大量系統資源,非常不利於性能優化。
JVM 在遇到一連串連續對同一個鎖請求與釋放操作時,會把所有鎖操作整合成對鎖的一次請求,為的就是減少對鎖的請求同步次數,這就叫做 鎖粗化。
比如:
public void demoMethod() {
synchronized(lock) {
// do sth.1
}
// do sth.2 (don't needs synchronized)
synchronized(lock) {
// do sth.3
}
}
JVM 自動優化:
public void demoMethod() {
synchronized(lock) {
// do sth.1
// do sth.2 (don't needs synchronized)
// do sth.3
}
}
下面展示一個在循環內請求鎖的範例,在這種情況下意味著每次循環都有申請鎖與釋放鎖的動作。
for (int i = 1; i < 100; i++) {
synchronized(lock) {
// do sth.
}
}
合理修正:
synchronized(lock) {
for (int i = 1; i < 100; i++) {
// do sth.
}
}
鎖粗化與減少鎖持有時間的思想是相悖的,但目的都是優化性能,二者在不同情境下效果不同,可以根據實際情境靈活運用。