Lock公平鎖與非公平鎖源碼對(duì)比解讀

關(guān)于非公平鎖的詳細(xì)介紹可以參考之前的博客,有詳細(xì)的源碼分析:Lock非公平鎖源碼解讀

為什么說(shuō)非公平鎖效率高于公平鎖,我們先看源碼

公平鎖lock

final void lock() {
    acquire(1);
}
/**
 * Fair version of tryAcquire.  Don't grant access unless
 * recursive call or no waiters or is first.
 */
protected final boolean tryAcquire(int acquires) {
    final Thread current = Thread.currentThread();
    int c = getState();
    if (c == 0) {
        // 區(qū)別點(diǎn):判斷隊(duì)列中是否有線程在等待
        if (!hasQueuedPredecessors() &&
            compareAndSetState(0, acquires)) {
            setExclusiveOwnerThread(current);
            return true;
        }
    }
    else if (current == getExclusiveOwnerThread()) {
        int nextc = c + acquires;
        if (nextc < 0)
            throw new Error("Maximum lock count exceeded");
        setState(nextc);
        return true;
    }
    return false;
}

非公平鎖lock

final void lock() {
    // 一上來(lái)就嘗試獲取鎖,減少進(jìn)入等待隊(duì)列,減少park,減少用戶(hù)態(tài)和內(nèi)核態(tài)的切換,從而提高性能。
    if (compareAndSetState(0, 1))
        setExclusiveOwnerThread(Thread.currentThread());
    else
        acquire(1);
}

非公平鎖區(qū)公平鎖的區(qū)別是什么??

  1. 非公平鎖,不講武德,一上來(lái)就“干”,不管有沒(méi)有人排隊(duì),一上來(lái)就嘗試獲取鎖。
  2. 公平鎖,先看隊(duì)列中有沒(méi)有其他線程在排隊(duì),同時(shí)也意味著,線程park可能性更多,更浪費(fèi)性能。
  3. 非公平鎖缺點(diǎn),有可能一個(gè)線程長(zhǎng)期獲取不到鎖,部分場(chǎng)景不適用,比如公平搶票場(chǎng)景。

why???為什么說(shuō)非公平鎖性能高于公平鎖

簡(jiǎn)單講,就是因?yàn)榉枪芥i不講武德這種方式,減少了park,減少了用戶(hù)態(tài)和內(nèi)核態(tài)的切換,從而提高性能。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容