公平鎖與非公平鎖源碼對比

語義:ui

1.公平鎖:每一個線程在獲取鎖的時候,會先檢查該鎖維護的等待隊列,若是該隊列是空或者當前線程是第一個,則佔有鎖,不然按照FIFO的原則,進入等待隊列,等待獲取鎖;spa

2.非公平鎖:當前線程在獲取鎖的時候,無論該鎖的維護隊列種是否有其它等待線程,直接CAS,若是cas失敗,則再執行公平鎖的那一套;線程

 

源碼比較以下:
公平鎖:code

 

        final void lock() {
            acquire(1);
        }

 

 

非公平鎖:blog

        final void lock() {
            if (compareAndSetState(0, 1))  //先嚐試獲取鎖
                setExclusiveOwnerThread(Thread.currentThread());
            else
                acquire(1);//獲取鎖失敗,再採用公平鎖的方式;
        }

 

 

 

 

關於鎖的釋放,公平鎖與非公平鎖是同樣的:隊列

    public final boolean release(int arg) {
        if (tryRelease(arg)) {
            Node h = head;
            if (h != null && h.waitStatus != 0)
                unparkSuccessor(h);
            return true;
        }
        return false;
    }

 

 

關於公平鎖與非公平鎖的更底層的一些東西,好比volatile的使用,由於涉及到native方法,暫時沒有深究。源碼

相關文章
相關標籤/搜索