基于核心源码和个人思考——ReentrantLock

516 阅读2分钟

ReentrantLock

  • ReentrantLock独占可重入锁,实现了Lock接口和可序列化接口。
  • ReentrantLock有一个核心的静态内部类Sync,实现了获取锁、锁释放锁的各种核心功能。ReentrantLock还有两个内部类,分别是FairSync和NonfairSyn内部类,都继承了核心内部类Sync,主要是重写了lock方法和tryAcquire方法,分别实现了公平竞争锁和非公平竞争锁。
  • Sync内部类继承了(AQS)AbstractQueuedSynchronizer抽象类,使用了AQS的线程等待队列机制。

Sync

ReentrantLock抽象静态内部类,继承AQS抽象类核心方法。

接口

  • lock() 抽象方法

  • nonfairTryAcquire(int acquires) 非公平获取锁,被非公平内部类的重写方法调用。

    if 锁state为0
        if CSA(获取锁)
            设锁的持有对象为当前线程。
            state = acquires
            结束 成功。
    else if 锁当前持有对象是当前线程  # 可重入特性
        state += acquires
        if state < 0 # 溢出判断 
            抛错误 Error("Maximum lock count exceeded");
        结束 成功。
    结束 失败。
    
  • tryRelease(int acquires) 尝试释放锁:

    if 锁持有线程不是当前线程 
        抛异常 IllegalMonitorStateException
    state 减去 acquires
    if state == 0
        所持有对象设为空
        结束 成功
    结束 失败
    
  • getOwner() 获取锁持有对象,没有则为null

  • getHoldCount() 获取锁的state,若当前线程不是该锁持有对象,则返回0

  • isLocked() 是否有锁

NonfairSync

非公平锁内部类,继承了抽象内部类Sync。

接口
  • lock() 锁:先尝试获取锁,获取失败才去排队(有可能插队成功)

    if CSA(获取锁)
        设置锁持有对象为当前线程
    else
        acquire(1)
    
  • tryAcquire()

    nonfairTryAcquire(acquires)
    

FairSync

公平锁内部类,继承了抽象内部类Sync。

接口

  • lock()

    acquire(1)
    
  • tryAcquire()

    if 锁state为0
        if 等待获取锁队列为空 and CSA(获取锁)
            设锁的持有对象为当前线程。
            state = acquires
            结束 成功。
    else if 锁当前持有对象是当前线程  # 可重入特性
        state += acquires
        if state < 0 # 溢出判断 
            抛错误 Error("Maximum lock count exceeded");
        结束 成功。
    结束 失败。
    

接口

  • lock() 获取锁:调用asyn类的lock方法
  • lockInterruptibly() 获取可响应中断锁
  • tryLock() 尝试获取锁,获取失败返回false,避免了死锁。
  • tryLock(long timeout, TimeUnit unit)
  • unlock() 释放锁
  • getHoldCount()
  • isHeldByCurrentThread()
  • isLocked()
  • isFair()
  • getOwner()
  • hasQueuedThreads()
  • hasQueuedThread(Thread thread)
  • getQueueLength()
  • getQueuedThreads()
  • newCondition()
  • hasWaiters(Condition condition)
  • getWaitQueueLength(Condition condition)
  • getWaitingThreads(Condition condition)

Condition

通过ReentrantLock实例调用newConditon方法产生,可对线程阻塞和释放。

接口

  • await() 阻塞当前线程
  • awaitNanos(long nanosTimeout) 阻塞到当前线程指定毫秒时间
  • await(long time, TimeUnit unit) 阻塞到当前线程指定时间,自定义单位
  • awaitUntil(Date deadline) 阻塞到指定时间
  • signal() 唤醒一个被阻塞线程
  • signalAll() 唤醒所有被阻塞线程