Java基础 -> ReentrantLock中的公平锁和⾮公平锁的底层实现

本文详细解析了ReentrantLock中的公平锁和非公平锁的原理,指出两者均使用AQS排队,区别在于加锁时线程的行为:公平锁按申请顺序排队,非公平锁直接竞争。它们都支持可重入,重点在于获取锁的瞬间策略不同。
摘要由CSDN通过智能技术生成

ReentrantLock中的公平锁和⾮公平锁的底层实现

公平锁:多个线程按照申请锁的顺序去获得锁,线程会直接进入队列去排队,永远都是队列的第一位才能得到锁。

非公平锁:多个线程去获取锁的时候,会直接去尝试获取,获取不到,再去进入等待队列,如果能获取到,就直接获取到锁。

  • ⾸先不管是公平锁和⾮公平锁,它们的底层实现都会使⽤AQS来进⾏排队

    • 公平锁和⾮公平锁都是进入的同一个队列
  • 它们的区别在于:线程在使⽤lock()⽅法加锁时

  • 如果是公平锁,会先检查AQS队列中是否存在线程在排队

    • 检查是否有线程在排队,有则当前线程也进⾏排队
    • 如果是⾮公平锁,则不会去检查是否有线程在排队,⽽是直接竞争锁。
      • 检查是否有线程在排队,也是检测的同一个队列
  • 不管是公平锁还是⾮公平锁,⼀旦没竞争到锁,都会进⾏排队

  • 当锁释放时,都是唤醒排在最前⾯的线程

    • 队列的先进先出原则
  • 所以⾮公平锁只是体现在了线程加锁阶段,⽽没有体现在线程被唤醒阶段

    • 体现在第一次获取锁的时候,第一次竞争失败后加入队列了就都是一样的了
  • 另外,ReentrantLock是可重⼊锁,不管是公平锁还是⾮公平锁都是可重⼊的。

    //默认非公平
    private ReentrantLock lock = new ReentrantLock();
    //加true是公平锁
    private ReentrantLock lock = new ReentrantLock(true);
    
    • 可重入就是说某个线程已经获得某个锁,可以再次获取锁而不会出现死锁

      • ReentrantLock和synchronized都是可重⼊锁
    • 简单理解就是:

    • 如果你拿到了锁1,接下来代码块又要拿一次锁1,你之前已经拿过锁1了,下面的也可以拿到

      synchronized (this) {
          System.out.println("第1次,锁是:" + this);
          //嵌套锁1 -> 此时是可以重复获得的,这就是可重入
          synchronized (this) {
              System.out.println("第2次,锁是:" + this);
          }
      }
      
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值