Java中的偏向鎖和輕量級(jí)鎖都是為了提高多線程并發(fā)操作的性能。
偏向鎖是指,當(dāng)只有一個(gè)線程訪問同步塊時(shí),JVM會(huì)將這個(gè)線程ID記錄在鎖對(duì)象的Mark Word中,下次該線程再訪問同步塊時(shí),直接進(jìn)入同步狀態(tài),不需要做任何同步操作,從而提高了性能。偏向鎖主要適用于只有一個(gè)線程訪問同步塊的場(chǎng)景。當(dāng)有多個(gè)線程訪問同步塊時(shí),偏向鎖會(huì)自動(dòng)撤銷。
輕量級(jí)鎖是指,當(dāng)只有一個(gè)線程訪問同步塊時(shí),JVM會(huì)在該線程的棧幀中創(chuàng)建一個(gè)鎖記錄(Lock Record),將鎖對(duì)象的Mark Word復(fù)制到鎖記錄中,并將鎖對(duì)象的Mark Word更新為指向鎖記錄的指針。這樣,當(dāng)該線程再次進(jìn)入同步塊時(shí),不需要做任何同步操作,直接進(jìn)入同步狀態(tài)。當(dāng)有多個(gè)線程訪問同步塊時(shí),輕量級(jí)鎖會(huì)自動(dòng)膨脹成重量級(jí)鎖。
輕量級(jí)鎖相對(duì)于重量級(jí)鎖而言,減少了線程間的競(jìng)爭(zhēng)和上下文切換,提高了多線程并發(fā)操作的性能,但是在多線程并發(fā)操作較為頻繁的場(chǎng)景下,會(huì)出現(xiàn)自旋等待的情況,會(huì)降低性能。因此,選擇使用偏向鎖和輕量級(jí)鎖還需要根據(jù)具體的應(yīng)用場(chǎng)景進(jìn)行綜合考慮。