ReentrantLock之公平与非公平模式

ReentrantLock之公平与非公平模式ReentrantLock是java重要的锁之一,这里只讨论其公平和非公平模式。1. 初始化ReentrantLock有两个构造函数,通过构造函数我们可以看到1. 默认使用的是非公平模式。2. 通过有参的构造函数可以指定使用公平还是非公平模式。 public ReentrantLock() { sync = new No...
摘要由CSDN通过智能技术生成

ReentrantLock之公平与非公平模式

ReentrantLock是java重要的锁之一,这里只讨论其公平和非公平模式。

1. 初始化

ReentrantLock有两个构造函数,通过构造函数我们可以看到
1. 默认使用的是非公平模式。
2. 通过有参的构造函数可以指定使用公平还是非公平模式。

    public ReentrantLock() {
        sync = new NonfairSync();
    }

    public ReentrantLock(boolean fair) {
        sync = fair ? new FairSync() : new NonfairSync();
    }

2. 公平与非公平实现

ReentrantLock是通过一个静态内部内Sync实现的,Sync继承自AbstractQueuedSynchronizer,并实现了其抽象方法。AbstractQueuedSynchronizer是java的一个抽象的同步器框架,大多数的java同步工具类都是由其实现。而NonfairSync和FairSync通过继承Sync实现锁的功能。接下来看下是如何实现公平与非公平的。

2.1 NonfairSync的非公平性实现

NonfairSync的实现代码如下:

static final class NonfairSync extends Sync {
        private static final long serialVersionUID = 7316153563782823691L;

        /**
         * Performs lock.  Try immediate barge, backing up to normal
         * acquire on failure.
         */
         //加锁方法
        final void lock() {
        	//cas,如果当前state=0则将state替换为1
            if (compareAndSetState(0, 1))
            	//替换成功,则表示获得锁,同时将当exclusiveOwnerThread设置为当前线程,之后会通过该值是否是当前线程来确定是否重入
                setExclusiveOwnerThread(Thread.currentThread());
            else
            	//替换失败,表示获取锁失败,此时通过acquire(1)进一步获取锁
                acquire(1);
        }

        protected final boolean tryAcquire(int acquires) {
            return nonfairTryAcquire(acquires);
        }
 }

如上图代码所示,当使用非公平模式时,ReentrantLock.loc

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值