概述
ReentrantLock基于AQS,在并发编程中可以实现公平锁和非公平锁来对共享资源进行同步,同时和synchronized一样,支持锁重入,除此之外,RenentrantLock更加灵活,支持实现更多丰富的功能。说到ReentrantLock根据它的中文名,翻译过来叫做,可重入锁。但是仅仅用可重入一个特性来描述ReentrantLock好像有点以偏概全,其公平锁,非公平锁的实现,以及condition的实现似乎都很重要。所以这也是编程人员命名的一个烦恼。
基于上面的概述,我们不难得出,ReentrantLock有四个比较重要的特性,公平与非公平加锁的实现,解锁的实现,条件变量的实现。下面就通过一些流程图以及源码的描述对这几个特性做细致的讲解。
非公平锁的实现
非公平锁,直接从它的字面意思理解,不公平的锁。ReentrantLock默认初始化就是非公平锁。非公平锁的意思就是一个线程可以不排队就直接去获得锁。
基于常识,如果一个银行窗口正在处理业务,人们公平地去排队,依次处理业务,与人们哄抢着占用窗口处理业务,我们会觉得公平地有秩序地去处理业务会更加节约时间。但是在计算机领域却不是这样的,当线程进入等待队列去排队的时候,如果要唤醒一个等待队列中的线程,让他来获得锁,那么将会需要一段CPU消耗时间来重新唤醒这个线程也就是要实现一次上下文切换,比起直接让另外一个线程获得这个锁,可以节省一些时间,从而让CPU利用率更高。
下面就通过一个例子,结合源码讲一下非公平锁加锁过程。例子是当前已经有一个线程获得了锁,此时,另外一个线程尝试去获得