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() 唤醒所有被阻塞线程