Lock接口定义了锁的核心方法:
下列方法的具体实现逻辑由Lock的实现类定义。
1.lock():获取锁。
2.lockInterruptibly():获取锁的过程可以被中断,与Synchronized关键字的区别之一。
3.tryLock():尝试获取锁。
4.unLock():释放锁。
5.newCondition():可以使等待特定的条件,与Synchronized关键字的区别之一。
ReentrantLock是Lock接口的实现类
Lock接口方法的具体实现逻辑:
1.lock():直接调用AQS的acquire()方法,获锁失败会阻塞线程,将其加入等待队列。
2.lockInterruptibly():直接调用acquireInterruptibly()方法。
3.tryLock():无论获取锁成功与否,均会立即返回结果(T/F),获取失败不会阻塞线程。
4.unLock():直接调用AQS的release()方法。
5.newCondition():默认实现。
ReentrantLock实现了公平锁和非公平锁,底层实现是基于静态抽象类Sync(AQS的子类)的实现类NonfairSync和FairSync,默认使用非公平锁。
NonfairSync和FairSync的区别在于tryAcquire()的具体实现上,FairSync要求只有CLH队头的线程能够获取锁,从而保证获取锁的顺序性。
公平锁:若当前线程是CLH的头节点,则尝试获取锁。若当前线程不是CLH的头节点,直接入队尾等待,不尝试获取锁。
非公平锁:直接尝试获取锁,无需等待。获取锁失败则加入队尾等待。