1.ReentrantLock(再入锁):
(1).在java.util.concurrent.locks包
(2).和CountDownLatch,FutureTask,Semaphore一样基于AQS实现。
AQS:AbstractQueuedSynchronizer
队列同步器。Java并发用来构建锁或其他同步主键的基础框架,是j.u.c package的核心。一般使用的方式是继承。还有各种基于CAS的基础操作方法。
AQS的核心内容:state以及先入先出的等待线程队列等待
利用AQS实现同步结构,至少调用两种方法。分别是acquire方法,获取资源的独占权。Realease释放对于某个资源的独占。
(3).能够实现比synchronized更细力度的控制。如:控制fairness(公平性)
(4).调用lock()之后,必须调用unlock()释放锁
(5).性能未必比synchronized高,并且也是可重入的。在低竞争场景中synchronized可能相对优势。
ReentrantLock公平性设置:
0,1相继获取(每个线程获取到锁的概率是一样的)
ArrayBlockingQueue
数组实现的线程安全的,有界的阻塞队列。内部通过互斥锁保护线程资源。互斥锁是通过
ReentrantLock实现的。
ArrayBlockingQueue与newCondition是组合关系
newCondition依赖于ArrayBlockingQueue实现
ArrayBlockingQueue通过await()和signal()的组合优雅的完成条件判断和通知等待
实际应用场景:ArrayBlockingQueue是数组实现的,线程安全的,有界的阻塞队列。内部互斥锁是通过ReentrantLock实现的。
总结: