ReentrantLock 和 Condition 都是基于 AbstractQueuedSynchronizer (AQS) 实现的。
以下是 ReentrantLock 与 AQS 的关系:
ReentrantLock
状态管理:ReentrantLock 通过 AQS 的 state 变量来表示锁的状态。状态为 0 表示锁未被持有,状态为 1 表示锁被持有。
队列管理:AQS 维护一个 FIFO 等待队列,当一个线程尝试获取锁但失败时,它会被加入到这个等待队列中。
模板方法:ReentrantLock 通过实现 AQS 的模板方法,如 tryAcquire 和 tryRelease,来定义锁的获取和释放逻辑。
Condition
在Java的并发编程中,Condition接口扮演着重要的角色,主要用于线程间的协调和通信。这个接口通常与ReentrantLock锁一起使用,提供了比Object类中的wait()、notify()和notifyAll()方法更加灵活和强大的线程等待/通知机制。
Condition接口提供的主要功能包括:
等待(Await):
await()方法使当前线程等待,直到其他线程通知(signal)或中断当前线程。与Object.wait()类似,当前线程会释放锁并进入等待状态。
await(long time, TimeUnit unit)是超时版的等待,允许线程在指定的时间后自动返回。
还有其他变种,如awaitUntil(Date deadline),允许线程一直等待直到特定的时间点。
通知(Signal):
signal()方法用于唤醒一个在Condition上等待的线程。这类似于Object.notify()。
signalAll()方法唤醒所有等待在此Condition上的线程。这相当于Object.notifyAll()。
安全容器
并发集合类(java.util.concurrent)
Java并发包java.util.concurrent提供了一系列从底层设计就支持线程安全的并发集合:
ConcurrentHashMap:一个高效的线程安全的哈希表,适用于高并发场景。
ConcurrentLinkedQueue:一个基于链接节点的线程安全队列,采用先进先出(FIFO)的排序原则。
CopyOnWriteArrayList:写时复制的列表,最适用于读多写少的并发场景。
CopyOnWriteArraySet:基于CopyOnWriteArrayList,适用于读多写少的场景,主要用于存储不经常变动的数据集。
阻塞队列类(java.util.concurrent)
阻塞队列不仅支持线程安全的数据操作,还可以在尝试添加或移除元素时阻塞线程:
ArrayBlockingQueue:一个由数组结构组成的有界阻塞队列。
LinkedBlockingQueue:一个由链表结构组成的可选有界阻塞队列。
PriorityBlockingQueue:一个支持优先级排序的无界阻塞队列。
DelayQueue:一个使用优先级队列实现的无界阻塞队列,内部元素只有在其指定的延迟时间过后才能被取出。
SynchronousQueue:一个不存储元素的阻塞队列,每个插入操作必须等到另一个线程调用移除操作,反之亦然。