并发编程 - ReentrantLock

ReentrantLock

对于锁的获取分为公平模式和非公平模式。默认是非公平模式。可由构造器参数来指定。对于tryLock()方法,ReentrantLock只使用了非公平模式。除此之外,也提供了响应中断、超时等功能。

非公平模式

获取锁
  • tryLock() : 尝试获取锁,如果获取成功返回true,如果获取失败直接返回false。
    并发编程 - ReentrantLock
    并发编程 - ReentrantLock

  • lock() : 获取锁。
    并发编程 - ReentrantLock
    并发编程 - ReentrantLock
    对于锁的获取成功与否的判定,使用cas方式。获取失败,执行acquire(…)方法。

并发编程 - ReentrantLock

并发编程 - ReentrantLock

acquire(…)的其他方法属于AQS的方法,这里不再叙述。参考AQS文章

公平模式

获取锁
  • lock() 获取锁
    并发编程 - ReentrantLock
    并发编程 - ReentrantLock
    并发编程 - ReentrantLock
    并发编程 - ReentrantLock
    与非公平模式不同的是,公平模式有hasQueuedPredecessors()方法。

并发编程 - ReentrantLock
判断在等待队列中是否有前驱节点在排队。(头节点有后继节点,该后继节点的线程不是当前线程。)

响应中断

并发编程 - ReentrantLock
并发编程 - ReentrantLock
该方法是AQS方法,tryAcquire(…)上面有说,也分为公平模式和非公平模式,这里不再叙述。参考AQS文章

超时

并发编程 - ReentrantLock
并发编程 - ReentrantLock
该方法是AQS方法,tryAcquire(…)上面有说,也分为公平模式和非公平模式,这里不再叙述。参考AQS文章

释放锁

  • unlock() : 释放锁
    并发编程 - ReentrantLock
    并发编程 - ReentrantLock
    如果成功释放锁,唤醒后继节点。

并发编程 - ReentrantLock
对同步状态减一,如果为0,设置exclusiveOwnerThread为null。