专栏首页earthchen的专栏ReentrantLock的公平与非公平

ReentrantLock的公平与非公平

ReentrantLock的公平与非公平

ReentrantLock

公平锁与非公平锁的区别

  • 非公平锁在调用 lock 后,首先就会调用 CAS 进行一次抢锁,如果这个时候恰巧锁没有被占用,那么直接就获取到锁返回了。
  • 非公平锁在 CAS 失败后,和公平锁一样都会进入到 tryAcquire 方法,在 tryAcquire 方法中,如果发现锁这个时候被释放了(state == 0),非公平锁会直接 CAS 抢锁,但是公平锁会判断等待队列是否有线程处于等待状态,如果有则不去抢锁,乖乖排到后面。

代码区别

由于都是实现的aqs,区别只在尝试加锁的时候操作不一样

非平锁的实现

/**
 * Performs lock.  Try immediate barge, backing up to normal
 * acquire on failure.
 * 在加锁的时候直接进行了cas操作去获取锁,不加入等待队列,当然如果失败,还是会和公平锁一样
 */
final void lock() {
    if (compareAndSetState(0, 1))
        setExclusiveOwnerThread(Thread.currentThread());
    else
        acquire(1);
}

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


/**
 * Performs non-fair tryLock.  tryAcquire is implemented in
 * subclasses, but both need nonfair try for trylock method.
 */
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;
}

公平锁

/**
 * 没有进行任何操作,直接获取锁
 */
final void lock() {
    acquire(1);
}

/**
 * Fair version of tryAcquire.  Don't grant access unless
 * recursive call or no waiters or is first.
 * 这里与非公平锁只有一个区别:判断等待队列是否有线程处于等待状态
 */
protected final boolean tryAcquire(int acquires) {
    final Thread current = Thread.currentThread();
    int c = getState();
    if (c == 0) {
        if (!hasQueuedPredecessors() &&
            compareAndSetState(0, acquires)) {
            setExclusiveOwnerThread(current);
            return true;
        }
    }
    else if (current == getExclusiveOwnerThread()) {
        int nextc = c + acquires;
        if (nextc < 0)
            throw new Error("Maximum lock count exceeded");
        setState(nextc);
        return true;
    }
    return false;
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 面试被问ReentrantLock的公平锁与非公平锁

    面试被问ReentrantLock的公平锁与非公平锁的区别以及实现。 建议先阅读Java中的锁原理、锁优化、CAS、AQS,看这篇就对了!

    田维常
  • Java ReentrantLock锁的公平性与非公平性

    锁按照公平性划分为公平锁和非公平锁,在Java中,ReentrantLock有这两种锁的具体实现,下文进行展示。

    夹胡碰
  • ReentrantLock非公平锁与公平锁的实现

    ReentrantLock是根据传入的参数来决定是否使用公平锁,默认使用非公平锁:

    哲洛不闹
  • 理解ReentrantLock的公平锁和非公平锁

    学习AQS的时候,了解到AQS依赖于内部的FIFO同步队列来完成同步状态的管理,当前线程获取同步状态失败时,同步器会将当前线程以及等待状态等信息构造成一个Nod...

    后端码匠
  • 【试验局】ReentrantLock中非公平锁与公平锁的性能测试

    硬件环境:   CPU:AMD Phenom(tm) II X4 955 Processor   Memory:8G   SSD(128G):/   HDD(1...

    用户1148394
  • 公平锁与非公平锁

    我们看输出线程的运行顺序和线程获取锁的顺序是一致的。这就是公平锁的特征,先到先得。下面我们看一下非公平锁。

    吉林乌拉
  • 公平锁与非公平锁

     其实好多人,在面试的时候都被问到过,可能是因为没有碰见过,在这里说一下吧,也当是为大家填一个坑

    彼岸舞
  • Java-ReentrantLock-非公平锁源码分析

    在了解AQS后,那应该怎么了解AQS的最佳实践那,我想再也没有Java官方的实践更加优秀了,这次我打算重新拿出系统源代码,并将其总结成一系列文章,以供将来查看.

    颍川
  • ​AQS中的公平锁与非公平锁,Condtion

    一行一行源码分析清楚 AbstractQueuedSynchronizer (二)

    Java技术江湖
  • 死磕 java同步系列之ReentrantLock源码解析(一)——公平锁、非公平锁

    Reentrant = Re + entrant,Re是重复、又、再的意思,entrant是enter的名词或者形容词形式,翻译为进入者或者可进入的,所以Ree...

    彤哥
  • 一分钟理解Java公平锁与非公平锁

    和朋友聊天他提到:ReentrantLock 的构造函数可以传递一个 bool 数据,true 时构造的是“公平锁”、false 时构造的是“非公平锁”。我的印...

    李红
  • 高并发编程-ReentrantLock非公平锁深入解析

    ReentrantLock是一个可重入的互斥锁,它不但具有synchronized实现的同步方法和同步代码块的基本行为和语义,而且具备很强的扩展性。Reentr...

    JavaQ
  • Java并发指南8:AQS中的公平锁与非公平锁,Condtion

    本文转自:http://hongjiev.github.io/2017/06/16/AbstractQueuedSynchronizer

    Java技术江湖
  • 带你快速了解Java锁中的公平锁与非公平锁

    Java语言中有许多原生线程安全的数据结构,比如ArrayBlockingQueue、CopyOnWriteArrayList、LinkedBlockingQu...

    程序员追风
  • java锁:第一章:公平和非公平锁

    java_wxid
  • 关于自旋锁的公平和非公平模式

    自旋锁是并发编程实战里面一个关于锁优化的非常重要的一个概念,通常情况下会配合CAS原语来实现轻量级的同步操作。

    我是攻城师
  • JUC并发编程之ReentrantLock非公平锁源码详解

    大家伙好,已经时隔将近一个月没更新博客了,今天分享的内容点为ReentrantLock非公平锁源码,为什么分享这个呢?因为在并发情况下,难免会造成数据安全性问题...

    黎明大大
  • Java-ReentrantLock-公平锁源码分析

    在了解AQS后,那应该怎么了解AQS的最佳实践那,我想再也没有Java官方的实践更加优秀了,这次我打算重新拿出系统源代码,并将其总结成一系列文章,以供将来查看.

    颍川
  • 【原创】Java并发编程系列16 | 公平锁与非公平锁

    上一篇提到重入锁 ReentrantLock 支持两种锁,公平锁与非公平锁。那么这篇文章就来介绍一下公平锁与非公平锁。

    java进阶架构师

扫码关注云+社区

领取腾讯云代金券