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

本文深入探讨了公平锁(FairSync)和非公平锁(NonfairSync)的源码实现,揭示了它们在读写操作中是否应被阻塞的不同策略。公平锁依据排队顺序决定是否等待,而非公平锁的写操作则无视等待直接竞争,读操作需判断队首是否为写操作。
摘要由CSDN通过智能技术生成

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

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值