1. 程式人生 > >公平鎖與非公平鎖源碼對比

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

exc 方式 native 非公平鎖 false 隊列 其它 釋放 null

語義:

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

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

源碼比較如下:
公平鎖:

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

非公平鎖:

        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方法,暫時沒有深究。

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