从零开始java多线程并发---锁(五):Lock接口源码以及实现ReentraintLock解析使用

一: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的基本概念

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值