一:locks包
1.我们来看一下locks包含了哪些东西(jdk源码):
2.相关简要类说明(这里为了方便,部分直接以类图说明,详情见文档)
(1)同步器基础
(2)独享锁
(3)读写锁 (共享锁/独享锁)
(4)LockSupport(实现线程阻塞)
LockSupport:用于创建锁和其他同步类的基本线程阻塞原语。
(5)Condition(监听器)
源于Object的线程监听器(实现wait()等方法),并且提供了更加丰富的Api
(6)StampedLock(锁型)
一种能力锁,用于控制读/写/乐观访问的能力锁
3.功能梳理
基于上面的类,我们可以大致梳理出一种Lock加锁的流程,总结下来Lock对外提供了2种锁:Lock(独享锁)和ReadWriterLock(独享锁/共享锁的锁组):
二:Lock接口Api的功能实现
1.Api
2.lcok() 方法流程解析
(1)源码解析
a.lock()实现方法指向2个方向
b.首先是NonFaitSync(以递归的方式来不停设置当前线程为独享(即线程的可重入))
c.其次是FairSync(尝试以独享线程去执行)
(2)总结
实则我们可以看出就是设置当前线程为独享,Lock接口的lock()保证了线程的独享(即锁)和可重入性。
3.lockInterruptibly()解析
(1)说明
获取锁定,除非当前线程是中断的(即使锁定状态),然后去获取锁。如果获取到所立刻执行,否则线程进入休眠(除非该线程支持中断锁且被其他线程的中断唤醒)
(2)源码解析
4.tryLock()/tryLock(long time, TimeUnit unit)
(1)说明
多个线程同时竞争,获取到锁的执行方法,没有获取到锁的线程立刻(或等待time)返回false,不在等待重入。
(2)源码解析
5.unlock()
(1)说明
unlock方法最终指向LockSupport的unpark(),文档说明给线程提供许可证,如果线程处于堵塞那就解除堵塞
(2)源码
三:ReentrantLock介绍和使用
1.介绍
ReentrantLock是接口Lock的实现类,用来实现Lock锁的功能语义同Synchronized基本是一样的。它是一把可重入的独享锁,内部实现的了AQS的独占锁功能。
2.构造方法
注意:默认非公平策略(非公平策略的吞吐量大于公平,因为非公平策略对于锁的感知是随机的而不是公平锁的全局检索)
3.使用方法
具体的使用方法见从零开始java多线程到分布式锁(十一):Lock的基本概念