公平锁(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,表明应该进入等待状态;非公平锁 的写操作不管三七二十一,我就是要参与竞争去,谁也拦不住;非公平锁的读操作需要判断等待队列里的头结点是不是写操作(通过是否共享来判断锁类型,读锁是共享的,写锁是独占的)。

 


版权声明:本文为qq_28802119原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。