Java在同步機制中的鎖分為偏向鎖、輕量級鎖和重量級鎖。其中偏向鎖和輕量級鎖是為了優化同步操作而總結出的機制。
偏向鎖是在Java1.6中引入的,其思路是假設在大多數情況下,鎖對象都只會被一個線程鎖定,如果這個假設成立,那么在第一次加鎖時就記錄下當前線程的ID,并設置對象頭中的標記位為偏向鎖模式。之后,該對象再次被鎖定時,只需要檢查其頭部的標記位是否為偏向鎖,如果是并且ID一致,程序就直接進入同步快即可結束。
public class BiasLock { public static void main(String[] args) { Object obj = new Object(); synchronized (obj) { System.out.println("First lock: " + Thread.currentThread().getName()); } synchronized (obj) { System.out.println("Second lock: " + Thread.currentThread().getName()); } } }
輕量級鎖是偏向鎖的一種升級,主要用于在多線程環境下對同步代碼塊的性能進行優化。在單線程下,偏向鎖和輕量鎖是沒有差別的。不同的是在多線程下,如果鎖對象被多個線程競爭,那么該鎖就會升格到輕量級鎖,此時該鎖對象頭上會記錄一個指向加鎖當前線程棧中鎖記錄 LockRecord 的指針。當有其他線程來競爭鎖時,輕量級鎖就會膨脹成重量級鎖。
public class LightweightLock { public static void main(String[] args) { Object obj = new Object(); synchronized (obj) { System.out.println("First lock: " + Thread.currentThread().getName()); synchronized (obj) { System.out.println("Second lock: " + Thread.currentThread().getName()); } } } }
總體來說,偏向鎖和輕量級鎖都是為了優化多線程環境中的同步操作而設計的,具體使用哪種鎖取決于代碼的具體情況。在Java中,使用偏向鎖和輕量級鎖來傳遞對象鎖的時候能夠提高性能,減少線程競爭,但是在并發程度較高的情況下,仍然需要使用重量級鎖。