公平鎖(FairSync)和非公平鎖(NonfairSync)

接着上一篇深入WriteLock和ReadLock,我們這篇博客將要揭開公平鎖(FairSync)和非公平鎖(NonfairSync)的神祕面紗。

 公平鎖(FairSync)源碼:

    /**
     * Fair version of Sync
     */
    static final class FairSync extends Sync {
        private static final long serialVersionUID = -2274990926593161451L;
        final boolean writerShouldBlock() {
            return hasQueuedPredecessors();
        }
        final boolean readerShouldBlock() {
            return hasQueuedPredecessors();
        }
    }

非公平鎖(NonfairSync)源碼:


    /**
     * Nonfair version of Sync
     */
    static final class NonfairSync extends Sync {
        private static final long serialVersionUID = -8159625535654395037L;
        final boolean writerShouldBlock() {
            return false; // writers can always barge
        }
        final boolean readerShouldBlock() {
            return apparentlyFirstQueuedIsExclusive();
        }
    }

可以看到,對於讀和寫操作是否應該被阻塞,公平鎖和非公平鎖採取了不同的策略。公平鎖的策略是判斷它前邊是否有正在等待的線程,如果有,返回true,表明應該進入等待狀態;非公平鎖 的寫操作不管三七二十一,我就是要參與競爭去,誰也攔不住;非公平鎖的讀操作需要判斷等待隊列裏的頭結點是不是寫操作(通過是否共享來判斷鎖類型,讀鎖是共享的,寫鎖是獨佔的)。

 

發佈了119 篇原創文章 · 獲贊 23 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章