JAVA并发(五)ReentrantLock&Condition

ReentrantLock是JAVA中除synchronized外,另一种简便的管理资源锁的工具类,它还提供了Condition对象的创建,供调用者添加不同的条件队列,实现更灵活多样化的等待机制,ReentrantLock是基于AQS实现的,所以在阅读本文前需要掌握AQSJAVA并发(二)AQS,否则会看起来比较吃力。

ReentrantLock

ReentrantLock有两个构造器,可选择公平锁FairSync和非公平锁NonFairSync

private final Sync sync;
public ReentrantLock() {
   
    sync = new NonfairSync();
}

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

公平锁与非公平锁

ReentrantLock的加锁lock()分为公平锁与非公平锁。

公平锁FairSync和非公平锁NonFairSync都继承至Sync,而Sync继承至AQS,因此,ReentrantLock是基于AQS实现的。公平锁与非公平锁的区别是lock的机制不同,而锁的释放是一致的,下方代码块截取了Sync类的加锁相关的方法。Sync提供了lock的抽象方法、非公平锁的tryAcquire方法。

abstract static class Sync extends AbstractQueuedSynchronizer {
   
    private static final long serialVersionUID = -5179523762034025860L;

    abstract void lock();

    final boolean nonfairTryAcquire(int acquires) {
   
        final Thread current = Thread.currentThread();
        int c = getState();
        if (c == 0) {
   
            if (compareAndSetState(0, acquires)) {
   
                setExclusiveOwnerThread(current);
                return true;
            }
        }
        else if (current == getExclusiveOwnerThread()) {
   
            int nextc = c + acquires;
            if (nextc < 0) // overflow
                throw new Error("Maximum lock count exceeded");
            setState(nextc);
            return true;
        }
        return false;
    }
}

NonfairSync&FairSync

公平锁与非公平锁的代码块如下。


                
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值