在 Java 程序中,經常需要對共享的資源進行管理和保護,以避免多個線程同時對資源進行操作導致數據出現混亂的情況。Java 中提供了兩種方式來實現鎖定 —— 鎖方法和鎖代碼塊。
鎖方法(或稱為方法鎖)是通過在方法的聲明中使用 synchronized 關鍵字來實現的。當一個線程進入該方法時,它會自動獲取該方法所屬的對象的鎖,這樣其他線程就無法進入該方法,直到該線程離開該方法時才會釋放鎖。
public synchronized void methodLock() { // 在這里執行需要保護的代碼 }
鎖代碼塊是通過在需要保護的代碼塊中,使用 synchronized 關鍵字和一個對象作為鎖來實現的。與方法鎖不同,鎖定的粒度更小,只有當一個線程進入鎖定代碼塊時,才會獲取該對象的鎖。
Object lock = new Object(); public void blockLock() { synchronized(lock) { // 在這里執行需要保護的代碼 } }
鎖定方法和鎖定代碼塊都能夠保證同一時刻只有一個線程訪問被保護的資源,從而避免了多線程并發訪問時出現的數據競爭問題。它們的選擇主要取決于需要保護的代碼塊的粒度大小。