文章目錄
- 概要
- 1. 非公平鎖的定義
- 2. synchronized 作為非公平鎖的原因
- 3. 非公平鎖的特點
- 4. 如何實現公平鎖
- 總結
概要
在Java中,synchronized 關鍵字用于實現同步,以確保在多線程環境下對共享資源的訪問是線程安全的。然而,synchronized 實現的鎖機制默認被認為是非公平鎖。以下是關于 synchronized 為何是非公平鎖的解釋:
1. 非公平鎖的定義
非公平鎖是指當一個線程釋放鎖時,等待隊列中的線程不一定按照它們等待的順序來獲取鎖,而是允許其他正在等待的線程或者新來嘗試獲取鎖的線程進行競爭。也就是說,非公平鎖不保證等待時間最長的線程會優先獲得鎖。
2. synchronized 作為非公平鎖的原因
- 效率優先:synchronized 的設計初衷是提供線程同步的功能,而非確保嚴格的公平性。非公平鎖允許新來的線程直接嘗試獲取鎖,這有助于減少線程切換的開銷,從而提高效率。
- 避免饑餓現象:雖然非公平鎖可能導致某些線程等待時間變長,但在實際使用中,由于線程調度的不確定性,很難出現某個線程長時間無法獲取鎖的情況(即饑餓現象)。
3. 非公平鎖的特點
- 性能較好:因為減少了線程切換的開銷,所以非公平鎖通常具有更好的性能。
- 可能產生饑餓現象:雖然這種情況在實際中較少出現,但在某些特定場景下,如果某個線程一直競爭失敗,可能會導致其長時間無法獲取鎖。
4. 如何實現公平鎖
如果需要更嚴格的公平性,可以使用 ReentrantLock 類來替代 synchronized。ReentrantLock 允許通過構造函數指定是否為公平鎖。當設置為公平鎖時,它會按照等待隊列中線程等待的順序來分配鎖。
總結
synchronized 作為Java中的內置鎖機制,默認實現為非公平鎖。這是基于性能考慮和避免饑餓現象的折中方案。在大多數場景下,非公平鎖的性能優勢足以彌補其可能帶來的不公平性。然而,在需要更嚴格公平性的場景中,可以使用 ReentrantLock 類來實現公平鎖。