在上两篇关于《高并发之JUC——AQS源码深度分析(一)》、《高并发之JUC——AQS源码深度分析,有你不得而知的条件等待队列(二)》文中介绍了Doug Lea设计的JUC高并发工具类AQS的设计思想及源码分析,同时也说明了AQS是整个JUC包其他工具类的基石。本文将介绍JUC工具包下面的首个实现类ReentrantLock,即公平锁和非公平锁。
应用示例
public static void main(String[] args) throws Exception{
// 重入锁,显示锁
ReentrantLock reentrantLock = new ReentrantLock();
// 条件队列。可调用signal方法来唤醒其他线程,相当于notify,可调用await方法阻塞当前线程,相当于wait。
Condition condition = reentrantLock.newCondition();
new Thread(()-> {
// 加锁
reentrantLock.lock();
System.out.println(Thread.currentThread().getId());
try {
Thread.sleep(1000);
// 唤醒其他线程,其他线程有机会获取到锁
condition.signal();
// 等待其他线程唤醒
condition.await();
System.out.println(Thread.currentThread().getId()+"执行完毕!");
Thread.sleep(1000);
condition.signal();
} catch (InterruptedException e) {
e.printStackTrace();
}
// 解锁,其他线程可获取到锁
reentrantLock.unlock();
}).start();
new Thread(()-> {
// 加锁
reentrantLock.lock();
System.out.println(Thread.currentThread().getId());
try {
Thread.sleep(1000);
// 唤醒其他线程,其他线程有机会获取到锁
condition