在Java中,鎖是解決并發問題的重要手段。但是,過度的使用鎖會導致性能下降,因此Java提供了輕量級鎖和重量級鎖來解決這個問題。
輕量級鎖的實現基于CAS操作,用于解決并發度高的情況。當同步方法被激活時,Java虛擬機首先將對象頭信息復制到線程的棧幀中,以此來判斷對象是否被鎖定。如果對象沒有被鎖定,則將輕量級鎖標記設置為”鎖定”狀態,將線程ID寫入對象頭中,然后執行同步代碼塊。如果同步代碼塊執行完畢,輕量級鎖將被釋放。
public synchronized void add(int num) { //此時可能會使用輕量級鎖 count += num; }
重量級鎖的實現是使用操作系統的互斥鎖,用于解決并發度低的情況。當某個線程嘗試獲取一個對象鎖時,如果該鎖已被其他線程占用,則該線程將進入阻塞狀態,直到該對象鎖被釋放或者線程被中斷。
public synchronized void sub(int num) { //此時會使用重量級鎖 count -= num; }
在實現中,Java虛擬機會進行自適應鎖的選擇,即根據代碼在運行時的情況自動選用輕量級鎖或重量級鎖。
總的來說,輕量級鎖適合并發度高的情況,能夠有效減少鎖競爭,從而提高程序的并發性能;重量級鎖適合并發度低的情況,能夠確保線程同步的正確性,保證程序的穩定性。