公平锁(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万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章