Java中ReentrantLock中 lock.lock(),加锁源码分析

99 阅读1分钟

ReentrantLock中 lock.lock(),加锁源码分析

  • lock方法 在这里插入图片描述
  • ReentrantLock类中的静态内部类中的Sync继承AQS,调用Sync内部的抽象方法lock();

在这里插入图片描述

  • 查看关于lock()实现的非公平锁和公平锁方法
  • 非公平锁会比公平锁多出一步基于CAS获取锁资源,获取不到才执行和公平锁一样的逻辑 在这里插入图片描述
  • 公平锁和非公平锁一样的处理逻辑acquire()方法分析
  public final void acquire(int arg) {
        if (!tryAcquire(arg) &&
            acquireQueued(addWaiter(Node.EXCLUSIVE), arg))
            selfInterrupt();
    }

在这里插入图片描述

  • 基于这个方法,公平与非公平锁有各自的实现

在这里插入图片描述

  • 非公平锁的实现 在这里插入图片描述 在这里插入图片描述
  • 公平锁的实现 在这里插入图片描述
  • 公平锁中hasQueuedPredecessors()方法分析查看是否有线程在双向队列中排队 在这里插入图片描述
  • 公平锁中的addWaiter()方法分析 在这里插入图片描述 在这里插入图片描述
  • 公平锁acquireQueued()方法分析 在这里插入图片描述
  • 对shouldParkAfterFailedAcquire()的作用是当前线程没有获取到锁资源,或者没有资格获取锁资源,该线程节点能不能被挂起 在这里插入图片描述