在Java 中,并發(fā)編程是一個(gè)非常重要的主題,尤其是在多核 CPU 時(shí)代中。Java 提供了一些并發(fā)包(concurrent package),包括鎖機(jī)制,來幫助開發(fā)人員更安全、方便地進(jìn)行線程同步操作。在并發(fā)編程中,公平鎖和非公平鎖是兩個(gè)非常重要的概念,接下來我們將會(huì)介紹它們的區(qū)別和應(yīng)用場景。
公平鎖(fair lock)是指當(dāng)多個(gè)線程訪問資源時(shí),按照他們發(fā)出訪問請(qǐng)求的順序來保證訪問的機(jī)會(huì)。在使用公平鎖的情況下,線程會(huì)進(jìn)入等待隊(duì)列中,直到當(dāng)前持有鎖的線程釋放鎖。如果此時(shí)有多個(gè)線程等待進(jìn)入臨界區(qū),它們就會(huì)按照請(qǐng)求的順序依次得到訪問的機(jī)會(huì)。
Lock lock = new ReentrantLock(true); //true 表示公平鎖
非公平鎖(non-fair lock)是指當(dāng)多個(gè)線程訪問資源時(shí),線程會(huì)直接先去嘗試獲取鎖,如果獲取不到則加入等待隊(duì)列中,不需要關(guān)心當(dāng)前是否有其他線程正在等待。在使用非公平鎖的情況下,線程可以直接進(jìn)入臨界區(qū),而不是等待鎖釋放。如果此時(shí)有其他線程正在等待獲取鎖,新線程也能先于其他線程直接得到訪問權(quán)。
Lock lock = new ReentrantLock(false); //false 表示非公平鎖
公平鎖和非公平鎖各有優(yōu)缺點(diǎn),在選擇哪種鎖時(shí)應(yīng)該根據(jù)實(shí)際場景來決定。在公平鎖的場景下,線程大概率會(huì)比在非公平鎖下等待更長時(shí)間,但是可以避免線程 "饑餓" 問題,保證每個(gè)線程都有公平的獲取鎖的機(jī)會(huì);而在非公平鎖的場景下,可以更高效地利用 CPU 的資源,減少線程的等待時(shí)間,但是會(huì)可能會(huì)造成一些線程 "饑餓"。